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

一、嵌套子查询

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

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

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

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

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

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);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值