【问题标题】:What is better option? IN operator or EXISTS什么是更好的选择? IN 运算符或 EXISTS
【发布时间】:2017-07-21 10:34:32
【问题描述】:

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

【问题讨论】:

  • 可能是 JOIN?
  • 两者都不一样..你的意思是..Customers c WHERE EXISTS (SELECT 1 FROM Sales s where s.Cust_ID= c.Customer_ID);

标签: mysql sql operators


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以将它们用于相同的目的,但exists 关键字通常在您检查 if 条件语句时使用。

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2020-12-01
      • 2016-05-11
      • 2012-09-25
      • 2011-01-21
      • 2012-06-10
      • 2011-12-29
      相关资源
      最近更新 更多