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
撰寫,因為子查詢依賴資料行運算式。