13.2.11.6 EXISTS または NOT EXISTS を持つサブクエリ
サブクエリがすべての行を返す場合。 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
EXISTS
TRUE
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
TRUE
for all y
であるか」という質問に答えると言った方が簡単です。”
MySQL 8.0.19以降では、NOT EXISTS
NOT EXISTS
TABLE
を添えて、以下のようにサブクエリで使用することもできます。
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
SELECT *
句を入れない場合と同じ結果になります
。