MySQL 9.0 发行说明
如果子查询返回任何行,EXISTS 为 subqueryTRUE,而 NOT EXISTS 为 subqueryFALSE。例如
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 子句相同。