VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
= は値を 1 つの値と比較します。ANY と ALL は、比較をサブクエリの結果全体の
前に置きます。そのどれかより大きい、そのすべてより大きい、という具合です。
自分で書くより他人のクエリで出会うことのほうが多いので、このレッスンで身に
付けるべきは、それを読めるようになることです。
始める前に mysql -u root -p sakila でクライアントを開いてください。
ANY と ALL の仕組み
COLUMN_LIST を必要な列に、TABLE_NAME をテーブルに、COLUMN_NAME をテスト
する列に、OTHER_TABLE をサブクエリが読むテーブルに置き換えます。> は任意の
比較演算子に置き換えられます。
ANY は、返された行の少なくとも 1 つに対して比較が成り立つとき真になります。
ALL は、すべての行に対して成り立つとき真になります。SOME は ANY の別の
書き方で、意味はまったく同じです。
サブクエリ内の NULL のせいで答えが決まらない場合、どちらも真や偽ではなく
NULL を返します。NULL に対する他の比較と同じで、WHERE はその行を除外します。
そのまま読んでください。> ANY は「少なくとも 1 つより大きい」で、最小値より
大きいのと同じです。> ALL は「すべてより大きい」で、最大値より大きいのと
同じです。
例
- 少なくとも 1 つより大きい
G の映画は 47 分なので、48 分以上のすべての映画が該当します。
- すべてより大きい
G の映画は 185 分で、これは
カタログ全体でも最長なので、そのすべてより長いものはありません。
- = ANY は IN
= ANY と IN は同じ演算子を 2 通りに書いたもので、IN の
ほうが速く読めます。同様に <> ALL は NOT IN であり、そのレッスンで説明する
NULL の罠も同じです。
空のサブクエリは結果を反転させる
これは知っておく価値のある部分です。間違っているように見えるからです。X の映画はないため、サブクエリは何も返さず、すべての映画が
返ります。空集合に対する ALL は真です。テストに失敗する行が 1 つもないから
です。空集合に対する ANY は、その裏返しの理由で偽なので、同じクエリを ANY
で書くと何も返りません。
したがって、サブクエリの入力ミスは、ALL ではテーブル全体を、ANY では空の
結果を返し、どちらの場合もエラーは出ません。
まとめ
> ANYは最小値より大きい、> ALLは最大値より大きい、と読んでください。SOMEはANYの別の書き方と読んでください。- 速く読めるため、
= ANYよりINを、<> ALLよりNOT INを使ってください。 - サブクエリが何も返さないとき、
ALLは真、ANYは偽になると考えてください。 - サブクエリ内の NULL のせいで答えが決まらないとき、真や偽ではなく NULL になると考えてください。