使用in vs存在于mysql上

时间:2018-05-16 00:34:57

标签: mysql sql

我知道有关此主题的问题非常相似。事实上,我所看到的每个例子都指向EXISTS和IN是相同的并返回相同的结果。我有一个使用两者的例子,但我得到了不同的结果。也许我做错了。我一般都是SQl的新手。 以下是使用MySQL的代码示例。

使用IN

进行首次查询
 select lastname, firstname
 from employees
 where officecode in (select officecode from offices where country = 'USA');

结果:

enter image description here

使用EXISTS进行第二次查询:

select lastname, firstname
from employees
 where exists (select officecode from offices where country = 'USA');

结果:

enter image description here

显然,查询不等同,因为我得到了不同的结果。我是否以错误的方式使用IN和EXISTS?

4 个答案:

答案 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