もしサブクエリーが行を返せば、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
サブクエリーは通常相互関係を持つので、実際はこれはよくあるような例ではありません。ここに、もう少し現実的な例があります。
複数の町には、どんな種類のお店がありますか?
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
ですか」、という質問に答えるという方が簡単です。