EXISTS
subquery
TRUE
NOT EXISTS
subquery
FALSE
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
传统上,
EXISTS
子查询以 开头
SELECT *
,但它可以以
SELECT 5
or
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
TRUE
y
”
在 MySQL 8.0.19 及之后的版本中,还可以在子查询中使用
NOT
EXISTS
or
NOT EXISTS
with
TABLE
,如下所示:
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
SELECT
*
结果与在子查询中不使用
WHERE
子句
时的结果相同。