文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  使用 ALL 的子查詢

15.2.15.4 使用 ALL 的子查詢

語法

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);

INANYSOME 一樣,只要滿足以下兩個條件,您就可以將 TABLEALLNOT 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 撰寫,因為子查詢依賴資料行運算式。