2017-07-21 33 views
0

有什麼更好的選擇?使用IN運算符還是EXISTS運算符?在性能和服務器負載方面。數據庫中是否有任何IN和/或EXISTS操作符的支持因素(如索引,約束或其他)?什麼是更好的選擇? IN運營商或EXISTS

下面是使用樣品查詢和EXISTS

SELECT * FROM Customers WHERE Customer_ID IN (SELECT Cust_ID FROM Sales); 

SELECT Customer_ID FROM Customers WHERE EXISTS (SELECT Cust_ID FROM Sales); 

如果這兩個查詢是不同的,什麼是更好的方法來計算或客戶名單?或者如果下面的查詢更復雜。

SELECT sub_id FROM subscription 
WHERE start_date = CURDATE() 
AND end_date > CURDATE() 
AND sub_id NOT IN (SELECT DISTINCT sub_id FROM subscription 
WHERE start_date < CURDATE()); 

是否可以將NOT IN運算符替換爲NOT EXISTS?在這種情況下,用NOT EXISTS重寫上面的查詢更好還是什麼?

+0

也許是JOIN? – jarlh

+1

兩者都不相同..你的意思是'客戶c在哪裏存在(從銷售s選擇1,其中s.Cust_ID = c.Customer_ID);' –

+0

這可以幫助你。 https://stackoverflow.com/questions/24929/difference-between-exists-and-in-in-sql –

回答

4

這兩個查詢做了不同的事情。你可能打算用相關的子查詢EXISTS

SELECT Customer_ID c 
FROM Customers c 
WHERE EXISTS (SELECT 1 FROM Sales s WHERE s.Cust_ID = c.Customer_Id); 

這兩種方法都很好,表達你的邏輯。我傾向於選擇EXISTS的原因有兩個:

  • NOT EXISTS通常是因爲它處理NULL的方式比NOT IN一個更好的選擇。這不適用於EXISTS/IN,但它溢出了。
  • 從性能的角度來看,EXISTS通常不會比IN差。
0

您可以使用它們相同的,但exists關鍵字通常用於檢查條件語句時。

In關鍵字一般用於列表比較。

此外,正如jarlh所說,您可以使用join替換in