什么是更好的选择? 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
。
什么是更好的选择?使用 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
。