構文:
operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)
ここで、comparison_operator
は次の演算子のいずれかです。
= > < >= <= <> !=
ANY
キーワード (これは比較演算子のあとに指定する必要があります) は、「このサブクエリーが返すカラム内の値の ANY
(いずれか) に対して比較が TRUE
である場合は TRUE
を返す」ことを示します。 例:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
テーブル t1
内に (10)
を含む行が存在するとします。 テーブル t2
に (21,14,7)
が含まれている場合、t2
には 10
より小さい値 7
が存在するため、この式は TRUE
です。 テーブル t2
に (20,10)
が含まれている場合、またはテーブル t2
が空である場合、この式は FALSE
です。 テーブル t2
に (NULL,NULL,NULL)
が含まれている場合、この式は不明 (つまり、NULL
) です。
サブクエリーで使用されている場合、ワード IN
は = ANY
のエイリアスです。 そのため、次の 2 つのステートメントは同じです。
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
式リストで使用されている場合、IN
と = ANY
はシノニムではありません。 IN
は式リストを取得できますが、= ANY
はできません。 セクション12.4.2「比較関数と演算子」を参照してください。
NOT IN
は <> ANY
ではなく、<> ALL
のエイリアスです。 セクション13.2.11.4「ALL を使用したサブクエリー」を参照してください。
ワード SOME
は ANY
のエイリアスです。 そのため、次の 2 つのステートメントは同じです。
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
ワード SOME
はほとんど使用されませんが、この例は、これがなぜ役立つ可能性があるかを示しています。 ほとんどの人びとにとって、「a is not equal to any b」(a はどの b にも等しくない) という英語のフレーズは「there is no b which is equal to a」(a に等しい b は存在しない) を示しますが、それはこの SQL 構文が示す内容とは異なります。 この構文は、「there is some b to which a is not equal」(a に等しくない b がいくつか存在する) を示します。 代わりに <> SOME
を使用すると、このクエリーの本当の意味がすべての人に理解されるようにするのに役立ちます。
MySQL 8.0.19 以降、テーブルに単一のカラムのみが含まれている場合は、スカラー IN
、ANY
または SOME
サブクエリーで TABLE
を使用できます。 t2
にカラムが 1 つしかない場合は、このセクションで前述したステートメントを次に示すように記述できます。各場合は、SELECT s1 FROM t2
を TABLE t2
に置き換えます:
SELECT s1 FROM t1 WHERE s1 > ANY (TABLE t2);
SELECT s1 FROM t1 WHERE s1 = ANY (TABLE t2);
SELECT s1 FROM t1 WHERE s1 IN (TABLE t2);
SELECT s1 FROM t1 WHERE s1 <> ANY (TABLE t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (TABLE t2);