oracle中exists
来源:互联网 发布:淘宝正品代购推荐 编辑:程序博客网 时间:2024/06/06 00:28
一、问题起因
起初是由两条语句执行结果不同,语句如下:
--分析以下结果
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,这一行可作为外查询结果行,否则不能作为结果
- oracle中exists用法
- oracle中exists
- oracle 中in 和exists
- Oracle中没有 if exists(...)
- Oracle中没有 if exists(...)
- oracle中 exists和notexists
- oracle中exists的用法
- ORACLE中in 和 exists区别
- ORACLE 中IN和EXISTS比较
- oracle 中 in ,EXISTs 的区别
- oracle中in和exists的区别
- ORACLE 中IN和EXISTS比较
- ORACLE 中IN和EXISTS比较
- oracle中exists和in的问题
- ORACLE 中IN和EXISTS比较
- oracle中exists和in的比较
- ORACLE中in 和 exists区别
- ORACLE 中IN和EXISTS比较
- 创建版本库
- AFNetworing同步网络请求?
- tornado提供图像服务
- window form 截屏
- iOS 加图片的动画退出应用
- oracle中exists
- Laravel队列处理
- React Native Navigator
- JSP Cookie 处理
- OpenGL内核模式学习笔记第1篇——开发环境的配置
- 静态工厂方法代替构造器
- 记录我的第一篇
- android模拟器failed to make and chown /acct/uid: Read-only file system的原因
- Python中的NULL和None