MySQL 8.4 发行说明
如果子查询返回任何行,则 EXISTS
为 subquery
TRUE
,而 NOT EXISTS
为 subquery
FALSE
。例如
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
传统上,EXISTS
子查询以 SELECT *
开头,但它可以以 SELECT 5
或 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 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
回答了问题 “对于所有 y
,x
是否为 TRUE
?”
您也可以使用 NOT EXISTS
或 NOT EXISTS
与 TABLE
在子查询中,如下所示
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
结果与在子查询中使用 SELECT *
且没有 WHERE
子句相同。