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 -- MariaDB 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?.

Retornar