SQL EXISTS和IN运算符的工作性质如何?

时间:2013-11-08 23:48:47

标签: sql sql-server-2008 exists

我正在搜索并尝试获取SQL Exists运算符,但直到我自己在SQL Server 2008中执行此操作时仍无法理解,但仍然不清楚,帮助

e.g。

看到我自己做了一些询问,检查它实际上是做什么的,

// using IN
select 
    customers.cus_id, customers.cusName 
from 
    customers 
where 
    customers.cus_id IN (Select cus_id from products 
                         where prodCategory= 'Consumer electronics')

// using Exists
Select 
    customers.cus_id, customers.cusName 
from 
    customers
where 
    exists (select cus_id from products 
            where prodCategory = 'Consumer electronics' AND customers.cus_id = products.cus_id)

两者都给出相同的结果,但是当我从第二个查询的子查询

中删除此部分时
......AND customers.cus_id=products.cus_id

然后它没有给出正确的结果,从Customers表返回所有记录。为什么?我认为这将清除我的概念,但需要一些帮助,帮助!

4 个答案:

答案 0 :(得分:3)

因为它是两个表之间的唯一连接。 IN方法通过cus_id列链接两个表,但EXISTS通过PK和FK连接customersproducts。如果你删除它就没有了关系。

这是一个品味你使用的问题。同时我更喜欢EXISTS / NOT EXISTS,因为它可读并且没有副作用,因为没有任何连接,也没有选择任何内容。

如果列可以为空,则NOT IN会出现问题。值得一读:http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

答案 1 :(得分:0)

如果删除该条件,则删除当前正在评估的记录与子查询中相应记录之间的连接。

子查询将对所有记录具有相同的结果,并且它将始终包含该类别中的所有产品。因此,如果该类别中有任何产品,它将返回所有客户,无论客户与产品之间是否存在任何关系。

当您使用in时,子查询中不需要该关系,因为in操作正在处理该关系。

答案 2 :(得分:0)

此查询:

Select cus_id from products where prodCategory= 'Consumer   electronics'

将返回与cus_id匹配消费电子产品的所有prodCategory值的列表。 IN子句表示如果该列表中包含customers.cus_id,则返回该行。所以,它有一些内置的AND。

但是,EXISTS子句表示如果子查询包含任何行,则将返回该行。它不关心该子查询的值是什么。因此,您必须添加AND以防止它返回与customers.cus_id不匹配的其他行

答案 3 :(得分:0)

我们可以使用两个运算符来获取相同的结果。在我们了解实际情况之前,让我举一些例子。

SELECT * FROM TABLE_1 returns records as shown below

Field1
1
2
3
4

SELECT * FROM TABLE_2 returns

Field2  Field3
1            4
2            6
3            7 
4            8

如果我们想获取TABLE_1中存在于TABLE_2的“Field3”中的数据,那么我们可以将查询与IN运算符一起使用

SELECT * FROM TABLE_1
WHERE FIELD1 IN ( SELECT FIELD3 FROM TABLE_2)

我们也可以将查询与EXISTS一起使用

SELECT * FROM TABLE_1
WHERE EXISTS(    SELECT ‘X’
FROM TABLE_2
WHERE TABLE_1.FIELD1 = TABLE_2.FIELD3
)

使用EXISTS时,请始终使用子查询中的where子句来连接表。不这样做将导致从主表中获取所有记录。例如,如果我们考虑下面的查询

SELECT * FROM TABLE_1
WHERE EXISTS(    SELECT Field3
FROM TABLE_2

)

将从TABLE_1获取所有记录,并与查询

相同
SELECT * FROM TABLE_1

另一个区别在于性能(取决于在外部/内部查询中选择的表)。 EXISTS的工作速度比IN快。您可以查看上述查询的效果计划以获取更多信息。