首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 比較運算子修飾詞 ALL、ANY、SOME 深度解析

     編輯:關於SqlServer

語法與邏輯

scalar_expression { = | <> | != | > | >= | < | <= } { ALL | SOME | ANY } (subquery)
  • ALL:子查詢傳回的所有值皆滿足條件才為真。
  • ANY / SOME:子查詢傳回的任一值滿足條件即為真(兩者等價)。

真值表範例

假設 t1(n) = {2,3},t2(n) = {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等於 2 或 3(相當於 IN)
SELECT * FROM t2 WHERE n <> ALL (SELECT n FROM t1)1,4不等於 2 且不等於 3(相當於 NOT IN)
SELECT * FROM t2 WHERE n <> ANY (SELECT n FROM t1)1,2,3,4不等於 2 或不等於 3,永真

NULL 陷阱(關鍵)

  • 若子查詢結果集包含 NULL,所有 ALL 比較均傳回 UNKNOWN(無列),因 value > NULL 為 UNKNOWN。
  • ANY 比較則不受 NULL 影響(只要有符合的非 NULL 值即為真)。

與 NOT EXISTS 差異

-- 1. NOT EXISTS:忽略子查詢 NULL,外層 NULL 會被選出
SELECT * FROM t2 a WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE n >= a.n);

-- 2. > ALL:子查詢有 NULL 即全無結果,外層 NULL 也被排除
SELECT * FROM t2 WHERE n > ALL (SELECT n FROM t1);

兩者邏輯相似,但 NULL 處理截然不同,務必根據業務語意選擇。

適用版本

SQL Server 2000 即支援,符合 ANSI SQL-92 標準,可移植至其他關聯式資料庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved