MySQL 9.0 版本注意事項
語法
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 編寫,因為子查詢依賴於欄位表達式。