欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle数据库SQL开发之高级子查询

程序员文章站 2022-05-06 23:42:39
...

一、嵌套子查询

• 在通常的子查询中,子查询是以嵌套的方式写在父查询的where、having、from子句中,所以被称为嵌套子查询.

• 嵌套子查询的执行过程:
– 1.子查询首先执行一次
– 2.用来自子查询的值确认或取消父查询的候选行;

二、相关子查询(父查询中的行每被处理一次,子查询就执行一次)

• 在where子句中使用相关子查询;
在select子句中使用相关子查询
• exists和not exists操作符。

1.• 相关子查询的执行过程:
–(1).取得父查询的候选行;
– (2).用候选行被子查询引用列的值执行子查询;
– (3).用来自子查询的值确认或取消候选行;
–(4).重复步骤(1)、(2)、(3),直到父查询中无剩余的候选行。
下图中 outer 为table1的表别名
oracle数据库SQL开发之高级子查询
–查询比本部门平均薪水高的员工姓名,薪水。

select empno,ename, sal,deptno
from emp outer--(别名)
where sal >
                (select avg(sal)
                from emp
                where deptno =
                outer.deptno) ;

–.查询比所在职位平均工资高的员工姓名,职位

select e.ename,e.job
from emp e
where e.sal > (select avg(emp.sal) from emp where emp.job = e.job);

–.查询工资为其部门最低工资的员工编号,姓名,工资。

select e.empno,e.ename,e.sal
from emp e
where e.sal = (select min(emp.sal) from emp where emp.deptno = e.deptno);

2.exists和not exists操作符
exists判断是否“存在”,具体操作如下:
• 子查询中如果有记录找到,子查询语句不会继续执行返回值为true
• 子查询中如果到表的末尾也没有记录找到,返回值为false
esists子查询并没有确切记录返回,只判断是否有记录存在,而且只要找到相关记录,子查询就不需要再执行,然后再进行下面的操作。这样大大提高了语句的执行效率。
not exists正好相反,判断子查询是否没有返回值。如果没
有返回值,表达式为真,如果找到一条返回值,则为假。

因为exists子句中,并没有确切记录返回,只返回真或假。所以’1’只是占位用,无实际意义。占位符运用。
-查询哪些人是经理?

select ename , job, sal, deptno
    from emp e
    where exists (select '1'
                  from emp
                  where mgr= e.empno);