サブクエリで値がまったく返らない場合、EXISTS
<subquery>
は TRUE
になり、NOT EXISTS <subquery>
は
FALSE
になります。
次に例を示します。
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
従来、EXISTS
サブクエリは
SELECT *
で開始しますが、SELECT 5
や
SELECT column1
などのように、どのように開始してもかまいません。このようなサブクエリ内の
SELECT
リストは MySQL
で無視されるため、重要ではありません。
上の例で、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 か''
という疑問の答えが得られると言ったほうが簡単です。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.