首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 被遺忘的比較運算子修飾詞:ALL、ANY、SOME 實戰詳解

     編輯:MySQL 資料庫相關知識

語法與邏輯

<比較運算子> {ALL | ANY | SOME} (子查詢)

  • ALL:滿足子查詢所有值才回傳 TRUE
  • ANY / SOME:滿足子查詢任一值即回傳 TRUE (兩者等價)

範例資料

CREATE TABLE t1 (n INT);
INSERT INTO t1 VALUES (2), (3);

CREATE TABLE t2 (n INT);
INSERT INTO t2 VALUES (1), (2), (3), (4);

完整測試矩陣

查詢結果邏輯解釋
SELECT * FROM t2 WHERE n > ALL (SELECT n FROM t1)4大於 t1 最大值 (3)
SELECT * FROM t2 WHERE n > ANY (SELECT n FROM t1)3, 4大於 t1 最小值 (2)
SELECT * FROM t2 WHERE n = ALL (SELECT n FROM t1)(空)同時等於 2 和 3 不可能
SELECT * FROM t2 WHERE n = ANY (SELECT n FROM t1)2, 3等同 IN
SELECT * FROM t2 WHERE n < ALL (SELECT n FROM t1)1小於 t1 最小值 (2)
SELECT * FROM t2 WHERE n < ANY (SELECT n FROM t1)1, 2小於 t1 最大值 (3)
SELECT * FROM t2 WHERE n <> ALL (SELECT n FROM t1)1, 4不等於 t1 任何值,等同 NOT IN
SELECT * FROM t2 WHERE n <> ANY (SELECT n FROM t1)1, 2, 3, 4永真 (任一不等即真)

NULL 陷阱 ⚠️

若子查詢結果集包含 NULL:

  • 所有 ALL 比較**直接回傳空結果** (因 UNKNOWN 導致)
  • ANY 不受此影響
-- 兩句邏輯相似但 NULL 處理截然不同
SELECT * FROM t2 a WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE n >= a.n);
SELECT * FROM t2 WHERE n > ALL (SELECT n FROM t1); -- t1 有 NULL 時無結果

適用版本與場景

  • SQL Server 2000 起支援
  • 適合集合式思維,替代 EXISTS/IN 更語意化
  • 效能與等價寫法相近,優化器會轉換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved