文档首页
MySQL 9.0 参考手册
相关文档 下载本手册

MySQL 9.0 参考手册  /  ...  /  带有 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 EXISTS 以及 TABLE,如下所示

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

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