Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Subqueries with EXISTS or NOT EXISTS

15.2.15.6 使用 EXISTS 或 NOT EXISTS 的子查询

如果子查询返回任何行,则 EXISTS 子查询TRUE,而 NOT EXISTS 子查询FALSE。例如:

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 中的商店?””?但它更容易回答问题 对于所有 yx 是否为 TRUE?”

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

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

结果与在子查询中使用 SELECT * 而不带 WHERE 子句相同。