MySQL 8.4 Release Notes
15.2.15.6 存在或不存在子查询
如果子查询返回任何行,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
更容易回答问题“"x
对于所有 y
是否为真?””
你也可以使用NOT EXISTS
或NOT EXISTS
与TABLE
在子查询中,如下所示:
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
结果和使用SELECT *
在子查询中没有WHERE
子句相同。