文档首页
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 subqueryTRUE,而 NOT EXISTS subqueryFALSE。例如

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

传统上,EXISTS 子查询以 SELECT * 开头,但它可以以 SELECT 5SELECT 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 回答了问题 对于所有 yx 是否为 TRUE

您也可以使用 NOT EXISTSNOT EXISTSTABLE 在子查询中,如下所示

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

结果与在子查询中使用 SELECT * 且没有 WHERE 子句相同。