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

SQL 循序漸進 (21):進階子查詢應用 — 彙總比較、清單比對與 UPDATE 修改

     編輯:關於SqlServer

子查詢在 WHERE 條件中的三大模式

1. 搭配彙總函數:高於平均價 100 元的買家

SELECT OWNERID
FROM ANTIQUES
WHERE PRICE > (SELECT AVG(PRICE) + 100 FROM ANTIQUES);
  • 子查詢計算「平均價 + 100」
  • 外層篩選價格高於此門檻的記錄
  • 可加 DISTINCT 去除重複買家

2. 搭配清單比對:有買過古董的擁有者姓氏

SELECT OWNERLASTNAME
FROM ANTIQUEOWNERS
WHERE OWNERID = (SELECT DISTINCT BUYERID FROM ANTIQUES);
  • 子查詢回傳買家 ID 清單
  • 外層比對擁有者 ID 是否在清單中
  • 注意:若子查詢回傳超過一列,= 會報錯,應改用 IN

修正版:

SELECT OWNERLASTNAME
FROM ANTIQUEOWNERS
WHERE OWNERID IN (SELECT DISTINCT BUYERID FROM ANTIQUES);

3. 用於 UPDATE:修正買家姓名錯誤

UPDATE ANTIQUEOWNERS
SET OWNERFIRSTNAME = 'John'
WHERE OWNERID = (
    SELECT BUYERID FROM ANTIQUES WHERE ITEM = 'Bookcase'
);
  • 子查詢先找出買 'Bookcase' 的 BUYERID
  • 外層 UPDATE 依該 ID 修正姓名
  • 前提:子查詢必須只回傳單一值,否則報錯

子查詢分類速查

類型特徵回傳適用運算子
純量子查詢單值1 列 1 欄=, <>, >, <...
列子查詢多值單欄N 列 1 欄IN, NOT IN, ANY, ALL
表子查詢多值多欄N 列 M 欄EXISTS, NOT EXISTS
相關子查詢參考外層欄位視情況上述皆可

最佳實務

  • 預期多值 → 一律用 IN/NOT IN/ANY/ALL
  • 僅需存在性檢查 → 優先 EXISTS(效能較佳)
  • UPDATE/DELETE 子查詢務必確保單一值回傳
  • 複雜邏輯考慮改寫為 JOIN 或 CTE 以利最佳化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved