EXISTS、NOT EXISTS子查询
如果一个子查询都返回任何行,EXISTS
subqueryTRUE,NOT EXISTS
subqueryFALSE例如:
SELECT column1FROM t1WHERE EXISTS (SELECT *FROM t2);
传统上,EXISTS
子查询以开头SELECT *
,但也可以以SELECT 5
或开头SELECT column1
。MySQL会忽略SELECT
此类子查询中的列表,因此没有区别。
对于前面的示例,如果t2
包含任何行,甚至包含NULL
值的行,则EXISTS
条件为TRUE
。这实际上是一个不太可能的示例,因为[NOT] EXISTS
子查询几乎总是包含相关性。以下是一些更实际的示例:
一个或多个城市设有哪种商店?
SELECT DISTINCT store_typeFROM storesWHERE EXISTS (SELECT *FROM cities_storesWHERE cities_stores.store_type = stores.store_type);没有城市在哪家商店?
SELECT DISTINCT store_typeFROM storesWHERE NOT EXISTS (SELECT *FROM cities_storesWHERE cities_stores.store_type = stores.store_type);所有城市都有什么样的商店?
SELECT DISTINCT store_typeFROM stores s1WHERE NOT EXISTS (SELECT *FROM citiesWHERE NOT EXISTS (SELECT *FROM cities_storesWHERE 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
或NOT EXISTS
with TABLE
,如下所示:
SELECT column1FROM t1WHERE EXISTS (TABLE t2);
结果SELECT *
与WHERE
在子查询中使用不带子句的结果相同。