日期:2014-05-17  浏览次数:20527 次

exists的用法问题

上面是emp表的数据


select * 
from emp e1
where exists (select * from emp e2 where e1.sal = 950)


select * 
from emp e1
where exists (select * from emp e2 where e2.sal = 950)

前面两个查询语句的第一个为什么只放回一条记录,而第二个则全部返回,exists不是真就全部返回吗?我对此研究了3个钟头都一头雾水,求大神讲解一下吧..小女子谢过了..

------解决方案--------------------
查询1的exists是依赖于主查询的,它为真时,当且仅当主查询的e1.sal = 950,而这个条件主查询只有一条记录

查询2的exists只要子查询的结果不为空,条件都成立,就会返回主查询的所有记录
------解决方案--------------------
select * from tb1 with(nolock) where 查询条件 and exists(
  select '随便写,都无所谓' from tb2 where tb1.主键=tb2.主键 and 其他条件)

只要exists括号后面的成立(存在),也就在返回true,那么他就执行括号前面的一次,返回一个true,执行一次前面的,返回一个true,执行一次前面的。。。。。。
------解决方案--------------------
第一个查询,exists的判断依赖主查询,结果集相当于select *  from  emp where sal = 950


第二个查询,exists判断子查询是否存在结果集,只要存在结果集,就返回所有主查询的结果集,结果集相当于select *  from  emp where 1=1 即where条件成立。