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

SQL 循序漸進 (20):別名、IN 運算子與子查詢綜合應用

     編輯:關於SqlServer

完整查詢範例:已下單客戶的姓氏與訂購品項

SELECT OWN.OWNERLASTNAME "Last Name", ORD.ITEMDESIRED "Item Ordered"
FROM ORDERS ORD, ANTIQUEOWNERS OWN
WHERE ORD.OWNERID = OWN.OWNERID
  AND ORD.ITEMDESIRED IN (SELECT ITEM FROM ANTIQUES);

結果輸出

Last Name    Item Ordered
---------    ------------
Smith        Table
Smith        Desk
Akins        Chair
Lawson       Mirror

逐句解析

  1. 別名:OWN、ORD 為資料表別名,簡化欄位參考(OWN.OWNERLASTNAME)並消除同名欄位歧義
  2. 欄位別名:"Last Name"、"Item Ordered" 為輸出標題
  3. FROM 顺序:ORDERS 先列出(主要查詢對象),ANTIQUEOWNERS 僅供補充姓名資訊
  4. EQUIJOIN:ORD.OWNERID = OWN.OWNERID 連接兩表
  5. IN 子查詢:
    • 子查詢 SELECT ITEM FROM ANTIQUES 回傳所有古董品項清單
    • AND 強制子查詢執行(等同 = ANY 或 = SOME)
    • 外層 ITEMDESIRED 必須在清單中才輸出

IN 運算子語意等價

-- 以下三者邏輯相同
WHERE column IN (subquery)
WHERE column = ANY (subquery)
WHERE column = SOME (subquery)

執行邏輯視覺化

對 ORDERS 每一列:

  1. 取得 ITEMDESIRED
  2. 與子查詢回傳的 ITEM 清單比對
  3. 存在於清單 → 保留該列並聯結 ANTIQUEOWNERS 取姓名
  4. 不存在 → 捨棄

實務提醒

  • 別名提升可讀性,多表查詢必加
  • IN (subquery) 子查詢若回傳大量列,考慮改用 EXISTS 或 JOIN
  • 子查詢無 WHERE 條件時會全表掃描,必要時加入篩選
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved