Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

15.2.15.6 存在或不存在子查询

如果子查询返回任何行,EXISTS subqueryTRUENOT 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更容易回答问题“"x 对于所有 y 是否为真?”

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

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

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