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
編寫,因為子查詢依賴於欄位表達式。