EXISTS
and NOT EXISTS
If a subquery returns any values at all, then EXISTS <subquery>
is TRUE
, and NOT EXISTS <subquery>
is FALSE
. For example:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
Traditionally an EXISTS
subquery starts with SELECT *
but it could begin with SELECT 5
or SELECT column1
or anything at all -- MySQL ignores the SELECT
list in such a subquery, so it doesn't matter.
For the above example, if t2
contains any rows, even rows with nothing but NULL
values, then the EXISTS
condition is TRUE
. This is actually an unlikely example, since almost always a [NOT] EXISTS
subquery will contain correlations. Here are some more realistic examples.
Example: What kind of store is present in one or more cities?
SELECT DISTINCT store_type FROM Stores
WHERE EXISTS (SELECT * FROM Cities_Stores
WHERE Cities_Stores.store_type = Stores.store_type);
Example: What kind of store is present in no cities?
SELECT DISTINCT store_type FROM Stores
WHERE NOT EXISTS (SELECT * FROM Cities_Stores
WHERE Cities_Stores.store_type = Stores.store_type);
Example: What kind of store is present in all cities?
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));
The last example is a double-nested NOT EXISTS
query -- it has a NOT EXISTS
clause within a NOT EXISTS
clause. Formally, it answers the question ``does a city exist with a store which is not in Stores?''. But it's easier to say that a nested NOT EXISTS
answers the question ``is x TRUE for all y?''.