一、嵌套子查询
- 在通常的子查询中,子查询是以嵌套的方式写在父查询的WHERE、HAVING、FROM子句中,所以被称为嵌套子查询。
- 嵌套子查询的执行过程
- 子查询首先执行一次
- 用来自子查询的值确认或取消父查询的候选行
- 嵌套子查询的写法
- 例如:
SELECT empno, ename, sal FROM emp e,(SELECT deptno,avg(sal) avgsal FROM emp GROUP BY deptno) d WHERE e.deptno =d.deptno AND e.sal >d.avgsal;
二、相关子查询
- 相关子查询是当子查询中引用了父查询表中的一个列时,Oracle服务器会执行相关子查询。
- 相关子查询的执行过程
1.取得父查询的候选行
2.用候选行被子查询引用列的值执行子查询
3.用来自查询的值确认或取消候选行
4.重复1、2、3,直到父查询中无剩余的候选行
- 相关子查询的写法
-例如:
SELECT empno,ename,sal,deptno FROM emp outer WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = outer.deptno) ;
三、EXISTS和NOT EXISTS操作符
- 相关子查询还可以使用EXISTS和NOT EXISTS操作符来进行操作。
- EXISTS 判断是否“存在”,具体操作如下:
- 子查询中如果有记录找到,子查询语句不会继续执行,返回值为TRUE
- 子查询中如果得到表的结尾都没有记录找到,返回值为FALSE
- EXISTS子查询并没有确切的记录返回,只是判断是否有记录存在,而且只要是找到相关记录,子查询就不需要继续执行,然后再进行下面的操作。这样大大提高了语句的执行效率。
- NOT EXSITS正好相反,判断子查询是否没有返回值。如果没有返回值,认为表达式为真,如果找到一条返回值,则为假。
- 例如:查询哪些人不是经理
SELECT ename,job,sal,deptno FROM emp e WHERE NOT EXISTS (SELECT '1' FROM emp WHERE mgr= e.empno); //注意:因为NOT EXSITS子句中,没有明确的返回值, //只返回真和假,所以不会返回空值, //即不用考虑子查询中去掉空值的问题。这是它与NOT IN的区别。
- 查询哪些人是经理
SELECT ename,job,sal,deptno FROM emp e WHERE EXISTS (SELECT '1' FROM emp WHERE mgr= e.empno); //注意:因为EXISTS子句中,没有明确的返回值,只返回真或假, //所以‘1’就是个占位符,没有实际的意义。