文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  使用 EXISTS 或 NOT EXISTS 的子查询

15.2.15.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 列表,因此没有任何区别。

对于前面的示例,如果 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 子句相同。