oracle中exists

一、问题起因

起初是由两条语句执行结果不同,语句如下:

--分析以下结果
select ename, sal
  from emp
 where sal in (select sal from emp e2 where e2.sal >= 2000);


select ename, sal
  from emp
 where exists (select ename, sal from emp e2 where e2.sal >= 2000);

以上语句使用的表是Oracle内置的emp、dept表,两条语句执行结果:

14条记录(emp表中所有雇员名字、工资)

6条记录(emp表中工资>=2000雇员名字、工资)

查询资料后的解释为:

1).以上两条语句使用的是非相关子查询

2).非相关子查询是独立于外部查询的子查询,子查询执行完毕后将值传递给外部查询

3).带有exists的非相关子查询不返回任何数据,只产生逻辑真值true或者逻辑假值false,若内层子查询的结果非空,则外层where子句返回true,否则返回false

4).根据第3条可推出:带有exists的非相关子查询的语句有两种结果集:a、子查询为true语句结果为外部查询全部结果;b、子查询为false语句结果为空结果集

根据以上四条可知为什么以上两条语句的结果不同


二、对exists和in子查询区别的总结(个人总结,没有参考权威书籍,所有资料来自互联网,错误之处望指正)

1.sql语句执行的顺序:

分析器会先看语句的第一个词,当它发现第一个词是select关键字时会跳到from关键字,然后通过from关键字找到表名并把表装入内存。接着找where关键字,如果找不到,则返回到select处找字段解析,如果找到则分析其中的条件,完成后再回到select分析字段。最后形成我们要的虚表。

2.相关子查询和非相关子查询

1).相关子查询子查询的查询条件依赖于外层父查询的某个属性值。相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。

2).exists通常用在相关子查询中

3).非相关子查询:子查询的查询条件不依赖于父查询。非相关子查询是独立于外部查询的子查询,子查询一次执行完毕,执行完毕后将值传递给外部查询。

4).in子句通常用在非相关子查询中,先执行子查询,将子查询的结果用于父查询

3.exists和in查询机制

1).exists机制是对外表作循环(loop)。通俗理解:将外查询表每一行代入内查询检验,如果内查询返回的结果取非空值,则exists子句返回true,这一行可作为外查询结果行,否则不能作为结果


猜你喜欢

转载自blog.csdn.net/qq_20240805/article/details/75145510