高级子查询(相关子查询)

(先看外部表,先选取外部表的第一行,用它的列与内部表的条件进行相连查询)
1.查询比所在职位平均工资高的员工姓名,职位

select ename,job
from emp b
where sal>(select avg(sal) from emp where EMP.DEPTNO
= b.DEPTNO)

2.查询每个部门工资最低/最高的两个员工姓名,编号,工资

select empno,ename,sal,DEPTNO
from EMP outerTab
where 1 >= (select count(*) from emp where EMP.sal < outerTab.sal and outerTab.DEPTNO = EMP.DEPTNO )
order by deptno,sal
select OUTERTAB.ename,OUTERTAB.sal,OUTERTAB.DEPTNO
FROM EMP outerTab -- 这个部门中工资第一高或者第二高的员工
where 1>= (select count(*) from emp where EMP.sal > outerTab.sal )
order by deptno,sal

3.查询哪些员工是经理

select *
from emp e
where (select count(empno) from emp p where p.mgr=e.EMPNO)>0
select ename from emp b
where b.empno  in 
(select mgr from emp where EMP.mgr = b.empno)(相关子查询)
select ename from emp where empno  in (select mgr from emp )(嵌套子查询)
select ename
from emp e
where exists(select 1 from emp p where p.mgr=e.empno)

4.查询哪些员工不是经理

select *
from emp e
where (select count(empno) from emp p where p.mgr=e.EMPNO)=0
select ename from emp b
where b.empno  not in 
(select mgr from emp where EMP.mgr = b.empno)(相关子查询)
select ename from emp where empno not  in (select nvl(mgr,100) from emp )(嵌套子查询)
select ename
from emp e
where not exists(select 1 from emp p where p.mgr=e.empno)

exsists和not exsists操作符
1.列出至少有一个雇员的所有部门名称

select dname 
from dept s
where  exists (select 1 from emp where EMP.DEPTNO=s.DEPTNO)

2.列出没有雇员的所有部门名称

select dname 
from dept s
where not exists (select 1 from emp where EMP.DEPTNO=s.DEPTNO)

猜你喜欢

转载自blog.csdn.net/weixin_34146805/article/details/87638145