メインコンテンツへスキップ

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. 少なくとも 1 つより大きい

最も短い G の映画は 47 分なので、48 分以上のすべての映画が該当します。

  1. すべてより大きい

行はなく、それが正しい答えです。最も長い G の映画は 185 分で、これは カタログ全体でも最長なので、そのすべてより長いものはありません。

  1. = 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 になると考えてください。

関連項目

  • IN — 同じテストを、ほとんどの人が書く形で書いたもの
  • サブクエリ — これらの演算子が比較対象とするクエリ
  • EXISTS — 値を比較するのではなく、行の有無をテストする