什么是更好的选择? IN运营商或EXISTS

时间:2017-07-21 10:34:33

标签: mysql sql operators

什么是更好的选择?使用IN运算符还是EXISTS运算符?在性能和服务器负载方面。数据库中的IN和/或EXISTS运算符是否有任何支持因子(如索引,约束或其他)?

以下是使用IN和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 EXISTS替换NOT IN运算符?在这种情况下,用NOT EXISTS重写上面的查询是更好还是什么?

2 个答案:

答案 0 :(得分: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通常是比NOT IN更好的选择,因为它处理NULL的方式。这不适用于EXISTS / IN,但会溢出。
  • 从绩效角度来看,
  • EXISTS通常不会比IN差。

答案 1 :(得分:0)

您可以使用它们,但在检查是否有条件语句时,通常会使用exists关键字。

In关键字通常与列表比较一起使用。

此外,正如jarlh所说,您可以使用in替换join