多列子查询:成对多列子查询(一一对应的关系)和不成对多列子查询
例如:从emp数据表中找出和30部门中任意一个雇员的佣金和薪水完全相同的雇员,并显示其姓名、部门编号、薪水和佣金
条件:和30部门薪水和佣金完全相同
第一步:查询30部门员工的薪水和佣金
select sal,comm from emp where deptno=30;
第二步:找出那些员工的收入是1600并且提成是300
select ename,deptno,sal,comm from emp where sal=1600 and comm=300
修改为
select ename,sal,deptno,comm from emp where (sal,nvl(comm,-2)) in (select sal,nvl(comm,-2) from emp where deptno=30) and deptno<>30;
不成对:
select ename,deptno,sal,comm from emp where sal in(select sal from emp where deptno=30) and nvl(comm,-3) in (select nvl(comm,-3) from emp where deptno=30) and deptno<>30;
子查询的空值处理:
例如:查询没有下属的员工的名字
第一步:查看哪些员工是主管
select mgr from emp ;
第二步:查看哪些员工不是主管
select empno,ename from emp where empno not in (select nvl(mgr,-1) from emp);
在from子句中使用子查询
任务;查询大于所在部门平均工资的雇员的姓名、工资、部门编号、以及所在部门的平均工资
最后的信息目标:
姓名、工资、部门便哈以及所在部门的平均工资
条件:员工的工资高于所在部门的平均工资
第一步:查询每个部门的平均工资
select avg(sal) from emp group by deptno;
第二步:将emp数据表和部门平均工资数据集合连到一起(emp数据表、部门的平均工资数据表【看成一个整体】)
select * from emp a,(select avg(sal) avgsal from emp group by deptno) b where a.deptno=b.deptno and a.sal>b.salavg
优化语句:
select a.ename,a.sal,a.deptno b.salavg from emp a,(select avg(sal) avgsal from emp group by deptno) b where a.deptno=b.deptno and a.sal>b.salavg