MySQL 9.0 發行說明
如果子查詢傳回任何資料列,則 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);結果與在子查詢中使用沒有 WHERE 子句的 SELECT * 時相同。