SQL中的EXISTS和IN之间的区别?
时间:2020-03-05 18:42:33 来源:igfitidea点击:
SQL中的EXISTS和IN子句有什么区别?
什么时候应该使用EXISTS
,什么时候应该使用IN
?
解决方案
回答
我假设我们知道它们的作用,因此使用方式有所不同,所以我将理解问题:什么时候重写SQL以使用IN代替EXISTS是个好主意,反之亦然。
这是一个公平的假设吗?
编辑:我要问的原因是,在许多情况下,我们可以基于IN重写SQL以改用EXISTS,反之亦然,对于某些数据库引擎,查询优化器将对二者进行不同处理。
例如:
SELECT * FROM Customers WHERE EXISTS ( SELECT * FROM Orders WHERE Orders.CustomerID = Customers.ID )
可以重写为:
SELECT * FROM Customers WHERE ID IN ( SELECT CustomerID FROM Orders )
或者加入:
SELECT Customers.* FROM Customers INNER JOIN Orders ON Customers.ID = Orders.CustomerID
所以我的问题仍然存在,原始的发布者是否想知道IN和EXISTS的功能,以及如何使用它,还是问是否要使用IN重写SQL以使用EXISTS来代替,反之亦然,这将是一个好主意吗?
回答
" EXISTS"会告诉我们查询是否返回了任何结果。例如。:
SELECT * FROM Orders o WHERE EXISTS ( SELECT * FROM Products p WHERE p.ProductNumber = o.ProductNumber)
IN用于将一个值与多个值进行比较,并且可以使用文字值,如下所示:
SELECT * FROM Orders WHERE ProductNumber IN (1, 10, 100)
我们还可以将查询结果与IN
子句一起使用,如下所示:
SELECT * FROM Orders WHERE ProductNumber IN ( SELECT ProductNumber FROM Products WHERE ProductInventoryQuantity > 0)
回答
我认为,
- 当需要将查询结果与另一个子查询匹配时,将使用" EXISTS"。需要在SubQuery结果匹配的地方检索Query#1结果。加入的种类。选择也已下订单表#2的客户表#1
- IN用于检索特定列的值是否位于列表(1,2,3,4,5)中的" IN"。选择位于以下邮政编码中的客户,即zip_code值位于(....)列表中。
何时在另一个上使用...当我们觉得它读起来合适时(更好地传达了意图)。
回答
可以通过这种方式使用exists
关键字,但实际上它是为了避免计数:
--this statement needs to check the entire table select count(*) from [table] where ... --this statement is true as soon as one match is found exists ( select * from [table] where ... )
这在具有条件条件语句" if"的地方最有用,因为"存在"比"计数"要快得多。
在要传递静态列表的地方,最好使用in:
select * from [table] where [field] in (1, 2, 3)
当在in语句中有一个表时,使用join
更有意义,但是大多数情况下都没有关系。查询优化程序应以两种方式返回相同的计划。在某些实现中(大多数是较旧的版本,例如Microsoft SQL Server 2000),in查询将始终获得嵌套的连接计划,而join查询将酌情使用嵌套,合并或者哈希。更现代的实现更智能,即使使用in,也可以调整计划。
回答
基于规则优化器:
- 当子查询结果非常大时," EXISTS"比" IN"要快得多。
- 当子查询结果非常小时," IN"比" EXISTS"快。
基于成本优化器:
- 没有区别。