高级子查询
嵌套子查询(普通子查询):
执行过程:1.子查询先执行2.用子查询的结果来确认或取消父查询的候选项
特点:子查询可以独立于父查询执行
相关子查询
执行过程:
- 获取父查询中的候选项
- 根据候选项获取的数据执行子查询
- 子查询执行的结果用于父查询的比较
- 重复以上三个步骤,直到父查询中无剩余的候选行
特点:子查询中查询条件依赖于外层查询中的某个值,所以子查询的处理不只一次,要反复求值,以供外层查询使用。exists和not exists操作符
相关子查询还可使用EXISTS和NOT EXISTS操作符来进行操作
EXISTS判断是否“存在”,具体操作如下:
–子查询中如果有记录找到,子查询语句不会继续执行,返回值为TRUE;
–子查询中如果到表的末尾也没有记录找到,返回值为FALSE。
EXISTS子查询并没有确切记录返回,只判断是否有记录存在,而且只要找到相关记录,子查询就不需要再执行,然后再进行下面的操作。这样大大提高了语句的执行效率。
NOT EXISTS正好相反,判断子查询是否没有返回值。如果没有返回值,表达式为真,如果找到一条返回值,则为假。
select ename,job,sal,deptno
from emp e
where exists (select '1'
from emp
where mgr=e.empno);
因为EXISTS子句中,并没有确切记录返回,只返回真或假。 所以’1’只是占位用,无实际意义。