-- 寫法 1: 聚合函數 MAX()
SELECT MAX(x) FROM table;
-- 寫法 2: ALL 子查詢
SELECT x FROM table WHERE x >= ALL (SELECT x FROM table);
| 特性 | MAX() | ALL 子查詢 |
|---|---|---|
| 語意 | 直接計算最大值 | 比較每一列值是否 >= 子查詢所有值 |
| 演算法 | 單次掃描,維護當前最大值 (O(N)) | 邏輯上需比較每對值 (O(N²)),優化器常轉為 MAX |
| 回傳型態 | 單一標量值 | 符合條件的列 (可能多筆,若有重複最大值) |
| NULL 處理 | 忽略 NULL | x >= ALL (...) 若子查詢含 NULL → 結果為 UNKNOWN (無列回傳) |
| 標準相容性 | SQL-92 核心 | SQL-92 核心 |
MAX() 效率顯著優於 ALL:
MAX():資料庫引擎內建優化,單次全表掃描,維護一個變數,極少記憶體ALL:邏輯上需對每一列與子查詢結果集比較,雖然現代優化器 (PostgreSQL, SQL Server, Oracle, MySQL 8.0+) 會自動重寫為 MAX(),但舊版本或複雜查詢可能退化為巢狀迴圈-- MAX()
EXPLAIN SELECT MAX(id) FROM large_table;
-- Result: Aggregate -> Seq Scan (單次掃描)
-- ALL
EXPLAIN SELECT id FROM large_table WHERE id >= ALL (SELECT id FROM large_table);
-- Result: 現代版本 → 同 MAX() 優化
-- 舊版本 → Nested Loop / Hash Join (多次掃描)
| 場景 | 推薦寫法 |
|---|---|
| 單純取得最大值 | MAX(col) |
| 需回傳最大值對應的完整列 | SELECT * FROM t WHERE col = (SELECT MAX(col) FROM t) |
| 比較邏輯複雜 (如多欄位) | ALL 可表達「大於所有」語意 |
| 教學/展示關係代數 | ALL 符合關係代數定義 |
CREATE TABLE t (x INT);
INSERT INTO t VALUES (1), (2), (NULL);
SELECT MAX(x) FROM t; -- 回傳 2 (忽略 NULL)
SELECT x FROM t WHERE x >= ALL (SELECT x FROM t); -- 回傳 0 列 (因子查詢含 NULL,比較結果為 UNKNOWN)
修正:WHERE x >= ALL (SELECT x FROM t WHERE x IS NOT NULL)
MAX()**:語意清晰、效能最佳、標準支援度高ALL 適用於表達「大於/小於所有」的複雜比較邏輯,但需注意 NULL 處理ALL,但不應依賴此行為