什么是更好的选择? IN 运算符或 EXISTS

What is better option? IN operator or EXISTS

什么是更好的选择?使用 IN 运算符或 EXISTS 运算符?在性能和服务器负载方面。 IN and/or 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 IN 运算符替换为 NOT EXISTS?在这种情况下,用 NOT EXISTS 重写上面的查询会更好吗?

这两个查询做不同的事情。您可能打算对 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差。

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

In关键字,一般用于列表比较。

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