我知道有关此主题的问题非常相似。事实上,我所看到的每个例子都指向EXISTS和IN是相同的并返回相同的结果。我有一个使用两者的例子,但我得到了不同的结果。也许我做错了。我一般都是SQl的新手。 以下是使用MySQL的代码示例。
使用IN
进行首次查询 select lastname, firstname
from employees
where officecode in (select officecode from offices where country = 'USA');
结果:
使用EXISTS进行第二次查询:
select lastname, firstname
from employees
where exists (select officecode from offices where country = 'USA');
结果:
显然,查询不等同,因为我得到了不同的结果。我是否以错误的方式使用IN和EXISTS?
答案 0 :(得分:2)
Exists
检查条件是否为真。
因此,在第二个查询中,只要exists
条件在内部查询中为真,它就会运行查询的第一部分。 Exists将检查内部查询是返回一行还是多行。在你的情况下,它将是真的,因此外部查询将像select lastname, firstname from employees;
但是在第一种情况下,它将检查在子查询中找到所有officecode
的条件,并匹配外部查询中的officecode
并返回具有国家USA
的条件。 }
答案 1 :(得分:2)
要让他们返回相同的结果,您需要为现有语句使用where子句将其与外部查询相关联... from employees e where exists (select o.officecode from offices o where o.country = 'USA' and o.officecode = e.officecode)
。每个人的回报也不同。 EXISTS
会返回BOOLEAN
。
答案 2 :(得分:1)
您的两个疑问非常不同。第一个查询是:
select e.lastname, e.firstname
from employees e
where e.officecode in (select o.officecode from offices o where o.country = 'USA');
(请注意,我对所有列名称进行了限定。)
这可以让相应办公室位于美国的员工。
此查询完全不同:
select e.lastname, e.firstname
from employees e
where exists (select o.officecode from offices o where o.country = 'USA');
这是一个全有或全无的查询。如果任何办公室在美国,它将返回所有员工。否则它什么也不返回。
要等同于第一个查询,您需要 correlation 子句。这将内部查询连接到外部查询:
select e.lastname, e.firstname
from employees e
where exists (select 1
from offices o
where o.officecode = e.officecode and o.country = 'USA'
);
通过此更改,两个查询应产生相同的结果。
答案 3 :(得分:0)
左连接和空检查更快。
Select * from t1
Left join t2 on(t1.=t2)
Where t2.id is null