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

SQL 循序漸進 (22):EXISTS 子查詢與 ALL 量詞運算子

     編輯:關於SqlServer

EXISTS:子查詢是否回傳列

EXISTS (subquery):子查詢至少回傳一列 → TRUE;無列回傳 → FALSE。

範例:查詢擁有「椅子」古董的所有人

SELECT OWNERFIRSTNAME, OWNERLASTNAME
FROM ANTIQUEOWNERS
WHERE EXISTS (
    SELECT * FROM ANTIQUES WHERE ITEM = 'Chair'
);
  • 若 ANTIQUES 有 'Chair' → 子查詢回傳列 → EXISTS 為真 → 列出所有擁有者
  • 若無 'Chair' → 子查詢空集 → EXISTS 偽 → 無結果

注意:此範例中子查詢未與外層關聯,故為「全表掃描」語意。實務常用相關子查詢(Correlated Subquery)依外層列值篩選。

ALL:與子查詢所有值比較

<比較運算子> ALL (subquery):外層值需滿足與子查詢每一值的比較。

範例:找出最高價古董及其買家

SELECT BUYERID, ITEM
FROM ANTIQUES
WHERE PRICE >= ALL (SELECT PRICE FROM ANTIQUES);
  • 子查詢回傳所有價格集合
  • 外層逐列檢查:PRICE >= 所有價格 → 僅最高價符合
  • 必須用 >=(而非 >),因最高價本身在集合中

等效寫法(較直觀):

SELECT BUYERID, ITEM FROM ANTIQUES
WHERE PRICE = (SELECT MAX(PRICE) FROM ANTIQUES);

比較:EXISTS vs IN vs ALL

效能提示

  • EXISTS 通常優於 IN(尤其子查詢大結果集時)
  • ALL 可改寫為彙總函數(MAX/MIN)獲取更好執行計畫
  • 相關子查詢需確保外層欄位有索引支援
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
運算子語意典型用途
EXISTS子查詢非空檢查關聯資料是否存在
IN值在集合中離散值比對
ALL與集合每值皆滿足比較極值查詢(MAX/MIN 替代)