MySQL 8.4 發行說明
語法
operand comparison_operator ALL (subquery)關鍵字 ALL 必須接在比較運算子之後,表示「如果子查詢傳回的資料行中所有值都符合比較條件,則傳回 TRUE。」例如:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);假設資料表 t1 中有一列包含 (10)。如果資料表 t2 包含 (-5,0,+5),則該運算式為 TRUE,因為 10 大於 t2 中的所有三個值。如果資料表 t2 包含 (12,6,NULL,-100),則該運算式為 FALSE,因為資料表 t2 中有一個值 12 大於 10。如果資料表 t2 包含 (0,NULL,1),則該運算式為未知(亦即 NULL)。
最後,如果資料表 t2 是空的,則該運算式為 TRUE。因此,當資料表 t2 為空時,以下運算式為 TRUE:
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);但當資料表 t2 為空時,此運算式為 NULL:
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);此外,當資料表 t2 為空時,以下運算式也為 NULL:
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);一般來說,包含 NULL 值的資料表和空的資料表是「邊緣案例」。撰寫子查詢時,請務必考慮是否已將這兩種情況納入考量。
NOT IN 是 <> ALL 的別名。因此,這兩個陳述式是相同的:
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);與 IN、ANY 和 SOME 一樣,只要滿足以下兩個條件,您就可以將 TABLE 與 ALL 和 NOT IN 一起使用:
子查詢中的資料表只包含一個資料行。
子查詢不依賴資料行運算式。
例如,假設資料表 t2 只包含單一資料行,則先前顯示的最後兩個陳述式可以使用 TABLE t2 這樣撰寫:
SELECT s1 FROM t1 WHERE s1 <> ALL (TABLE t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (TABLE t2);諸如 SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2); 之類的查詢無法使用 TABLE t2 撰寫,因為子查詢依賴資料行運算式。