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"快。

基于成本优化器:

  • 没有区别。