高级子查询

高级子查询

嵌套子查询(普通子查询):

执行过程:1.子查询先执行2.用子查询的结果来确认或取消父查询的候选项
特点:子查询可以独立于父查询执行

相关子查询

执行过程:

  1. 获取父查询中的候选项
  2. 根据候选项获取的数据执行子查询
  3. 子查询执行的结果用于父查询的比较
  4. 重复以上三个步骤,直到父查询中无剩余的候选行
    特点:子查询中查询条件依赖于外层查询中的某个值,所以子查询的处理不只一次,要反复求值,以供外层查询使用。

    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’只是占位用,无实际意义。