サブクエリーが少なくとも 1 行を返す場合、EXISTS
は subquery
TRUE
であり、NOT EXISTS
は subquery
FALSE
です。 例:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
従来より、EXISTS
サブクエリーは SELECT *
で始まりますが、SELECT 5
や SELECT column1
、あるいはほかの何で始まってもかまいません。 MySQL はこのようなサブクエリー内の SELECT
リストを無視するため、何も違いは生まれません。
前の例では、t2
に何らかの行が含まれている場合 (NULL
値以外は何も含まれていない行でも)、EXISTS
条件は TRUE
です。 [NOT] EXISTS
サブクエリーには、ほぼ常に相互関係が含まれるため、これは実際にはありそうにもない例です。 次に、より現実的な例をいくつか示します。
-
1 つ以上の市に存在するのはどのような種類のお店ですか?
SELECT DISTINCT store_type FROM stores WHERE EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);
-
どの市にも存在しないのはどのような種類のお店ですか?
SELECT DISTINCT store_type FROM stores WHERE NOT EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);
-
すべての市に存在するのはどのような種類のお店ですか?
SELECT DISTINCT store_type FROM stores s1 WHERE NOT EXISTS ( SELECT * FROM cities WHERE NOT EXISTS ( SELECT * FROM cities_stores WHERE cities_stores.city = cities.city AND cities_stores.store_type = stores.store_type));
最後の例は、二重にネストされた NOT EXISTS
クエリーです。 つまり、NOT EXISTS
句の中に NOT EXISTS
句が存在します。 これは正式には、「Stores
にないお店が含まれている市は存在しますか」? という質問に答えます。 ただし、ネストされた NOT EXISTS
が、「x
はすべての y
に対して TRUE
ですか?」という質問に答えるという方が簡単です。
MySQL 8.0.19 以降では、次のように、NOT EXISTS
または NOT EXISTS
を TABLE
とともにサブクエリーで使用することもできます:
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
結果は、サブクエリーで WHERE
句を指定せずに SELECT *
を使用した場合と同じです。