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

SQL 中用什麼替代 IN?EXISTS 效能更優詳解

     編輯:關於SqlServer

IN vs EXISTS:核心差異

當需要「某欄位值在一組值中」時,常見寫法有二:

-- 寫法 1:IN 子查詢
WHERE column IN (SELECT col FROM table2 WHERE ...);

-- 寫法 2:EXISTS 相關子查詢
WHERE EXISTS (SELECT 'X' FROM table2 WHERE table2.col = table1.column AND ...);

為何 EXISTS 通常更快?

  • IN:先執行子查詢產生結果集,存入臨時表(含索引),再與外部表連接。子查詢結果大時記憶體/TempDB 壓力大。
  • EXISTS:採用「半連接」邏輯,外部表每列只需在內部表尋找第一筆匹配即停止,若有索引則極快;不產生中間結果集。

NOT IN vs NOT EXISTS

NOT IN 若子查詢回傳 NULL 會導致整個判斷為 UNKNOWN(無資料回傳),且同樣需建立臨時表。NOT EXISTS 無此問題,效能也更穩定,強烈建議統一改用 NOT EXISTS。

實戰改寫範例

-- 原本 IN 寫法
SELECT * FROM Orders o
WHERE o.CustomerID IN (SELECT CustomerID FROM Customers WHERE Country = 'USA');

-- 改用 EXISTS
SELECT * FROM Orders o
WHERE EXISTS (
    SELECT 1 FROM Customers c
    WHERE c.CustomerID = o.CustomerID
      AND c.Country = 'USA'
);

適用情境總結

情境建議
子查詢結果集極小(< 100 列)且無 NULLIN 可讀性較好,效能差異微乎其微
子查詢結果集大、或含 NULL、或需相關欄位比對EXISTS / NOT EXISTS
單純常值清單(如 IN (1,2,3))直接用 IN,最簡潔

掌握這兩者差異,能在撰寫高效能 SQL 時做出正確選擇。

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