我正在搜索并尝试获取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
表返回所有记录。为什么?我认为这将清除我的概念,但需要一些帮助,帮助!
答案 0 :(得分:3)
因为它是两个表之间的唯一连接。 IN
方法通过cus_id
列链接两个表,但EXISTS
通过PK和FK连接customers
和products
。如果你删除它就没有了关系。
这是一个品味你使用的问题。同时我更喜欢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快。您可以查看上述查询的效果计划以获取更多信息。