13.2.10.6 具有 EXISTS 或 NOT EXISTS 的子查询
如果子查询根本返回任何行,则EXISTS subquery
是TRUE
,而NOT EXISTS subquery
是FALSE
。例如:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
传统上,EXISTS
子查询以SELECT *
开头,但也可以以SELECT 5
或SELECT column1
或任何其他开头。 MySQL 会忽略此类子查询中的SELECT列 table,因此没有区别。
对于前面的示例,如果t2
包含任何行,甚至是仅包含NULL
值的行,则EXISTS
条件为TRUE
。这实际上是一个不太可能的示例,因为[NOT] EXISTS
子查询几乎总是包含相关性。以下是一些更实际的示例:
- 一个或多个城市设有哪种 Store?
SELECT DISTINCT store_type FROM stores
WHERE EXISTS (SELECT * FROM cities_stores
WHERE cities_stores.store_type = stores.store_type);
- 没有城市在哪家 Store?
SELECT DISTINCT store_type FROM stores
WHERE NOT EXISTS (SELECT * FROM cities_stores
WHERE cities_stores.store_type = stores.store_type);
- 所有城市都有什么样的 Store?
SELECT DISTINCT store_type FROM stores s1
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
内的 Store”?但是说一个嵌套的NOT EXISTS
回答问题“所有* y
是 x
* TRUE
是吗?”更容易说。