Documentation Home
MySQL 8.0 参考手册  / 第 13 章 SQL 语句  / 13.2 数据操作语句  / 13.2.11 子查询  /  13.2.10.6 带有 EXISTS 或 NOT EXISTS 的子查询

13.2.10.6 带有 EXISTS 或 NOT EXISTS 的子查询

如果子查询完全返回任何行,则 is 和is 。例如: EXISTS subqueryTRUENOT EXISTS subqueryFALSE

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

传统上,EXISTS子查询以 开头 SELECT *,但它可以以 SELECT 5orSELECT 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 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的问题?但更容易说嵌套NOT EXISTS回答了 是 为所有人? ”的问题。x TRUEy