SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
当前回答
我认为,
EXISTS是当您需要将查询结果与另一个子查询匹配时。 查询#1的结果需要在SubQuery结果匹配的地方检索。有点像Join.. 例如,选择表1中也下过表2订单的客户 IN用于检索特定列的值是否位于列表(1,2,3,4,5)中 例如,选择位于以下邮政编码中的客户,即zip_code值位于(....)列表中。
什么时候使用一种而不是另一种……当你觉得读起来合适的时候(更好地传达意图)。
其他回答
我的理解是,只要我们不处理NULL值,两者都应该是相同的。
同样的原因,查询不返回值for = NULL vs is NULL。 http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
至于布尔和comparator参数,为了生成一个布尔值,两个值都需要进行比较,这就是任何if条件的工作方式。所以我不明白IN和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)
如果你可以用where in代替where exists,那么where in可能更快。
使用where in或where exists 将遍历父结果的所有结果。不同之处在于where exists将导致大量依赖子查询。如果你可以防止依赖子查询,那么where in将是更好的选择。
例子
假设我们有10,000家公司,每家公司有10个用户(因此我们的用户表有100,000个条目)。现在假设您希望通过用户名或公司名查找用户。
下面使用were exists查询的执行时间为141ms:
select * from `users`
where `first_name` ='gates'
or exists
(
select * from `companies`
where `users`.`company_id` = `companies`.`id`
and `name` = 'gates'
)
这是因为对每个用户执行一个依赖子查询:
然而,如果我们避免exists查询并使用:
select * from `users`
where `first_name` ='gates'
or users.company_id in
(
select id from `companies`
where `name` = 'gates'
)
然后避免依赖子查询,查询将在0,012毫秒内运行
我发现使用EXISTS关键字通常非常慢(这在Microsoft Access中非常真实)。 相反,我以这样的方式使用join操作符: should-i-use-the-keyword-exists-in-sql
据我所知,当子查询返回NULL值时,整个语句变成NULL。在这种情况下,我们使用EXITS关键字。如果我们想在子查询中比较特定的值,那么我们使用in关键字。