文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (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 子查詢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? 但更簡單的說法是,巢狀的 NOT EXISTS 回答的問題是 對於所有 y 而言,x 是否為 TRUE

您也可以在子查詢中使用 NOT EXISTSNOT EXISTS 以及 TABLE,如下所示:

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

結果與在子查詢中使用 SELECT * 且沒有 WHERE 子句時相同。