MySQL 8.4 發行說明
如果子查詢傳回任何資料列,EXISTS
為 子查詢
TRUE
,而 NOT EXISTS
為 子查詢
FALSE
。例如:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
傳統上,EXISTS
子查詢會以 SELECT *
開始,但也可以用 SELECT 5
或 SELECT 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 EXISTS
或 NOT EXISTS
以及 TABLE
,如下所示:
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
結果與在子查詢中使用 SELECT *
且沒有 WHERE
子句時相同。