MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  ANY、IN、または SOME を使用したサブクエリー

13.2.11.3 ANY、IN、または SOME を使用したサブクエリー

構文:

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 を使用したサブクエリー」を参照してください。

ワード SOMEANY のエイリアスです。 そのため、次の 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 以降、テーブルに単一のカラムのみが含まれている場合は、スカラー INANY または SOME サブクエリーで TABLE を使用できます。 t2 にカラムが 1 つしかない場合は、このセクションで前述したステートメントを次に示すように記述できます。各場合は、SELECT s1 FROM t2TABLE 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);

関連キーワード:  ステートメント, TABLE, CREATE, サブクエリー, DROP, FROM, IN, FUNCTION, SOME, テーブル