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