oracle高级子查询练习题

oracle高级子查询

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

先求出职位的平均工资,再查询

select ename,job
from emp e
where sal>(select avg(sal) from emp where job=e.job)
2.查询工资为其部门最低工资的员工编号,姓名,工资。

先求出部门最低工资,再查询

select empno,ename,sal
from emp e
where sal=(select min(sal) from emp where deptno=e.deptno)
3.查询所有雇员编号,名字和部门名字。

部门名称跟其他不在同一份表,就需要嵌套进查询里面,传部门号进去单独查询

select empno,ename,(select dname from dept where deptno=e.deptno)
from emp e
4.查询哪些员工是经理?

根据自身的编号查询是否有员工的经理编号是相同的,大于0则为自己是经理

select *
from emp e
where (select count(empno) from emp where mgr =e.empno)>0
5.查询哪些员工不是经理?

相反,判断为0则为不是经理

select *
from emp e
where (select count(empno) from emp where mgr =e.empno)=0
6.查询每个部门工资最低的两个员工编号,姓名,工资。

判断比自己工资还少的人数,比自己工资还少的人数为1,则自己为倒数第二
人数为0时,自己就是工资最少的那个人

select empno,ename,sal,deptno
from emp e
where (select count(empno) from emp 
where deptno =e.deptno and sal<e.sal)<=1 
and sal is not null
7.列出至少有一个雇员的所有部门名称。

exists为判断是否“存在”,根据部门编号,查询是否有人

select dname
from dept d
where exists (select '1' from emp where deptno=d.deptno)
8.列出一个雇员都没有的所有部门名称。

not exists 为不存在的意思

select dname
from dept d
where not exists (select '1' from emp where deptno=d.deptno)
9.查询薪水多于他所在部门平均薪水的雇员名字,部门号。

查询出部门平均工资,再判断自身工资

select ename,deptno
from emp e
where sal>(select avg(sal) from emp where deptno =e.deptno)
10.查询员工姓名和直接上级的名字。

根据经理编号与员工编号连接两个表

select e.ename,(select ename from emp where empno=e.mgr)
from emp e 
11.查询每个部门工资最高的员工姓名,工资。

查询部门最高的工资,再判断工资是否跟自己相等

select ename,sal
from emp e
where sal=(select max(sal) from emp where deptno =e.deptno)
12.查询每个部门工资前两名高的员工姓名,工资。

判断比自己工资还高的人数,比自己工资还高的人数为1,则自己为第二
人数为0时,自己就是工资最高的那个人

select ename,sal,deptno
from emp e
where (select count(empno) from emp 
where deptno =e.deptno and sal>e.sal)<=1 
and sal is not null

你可能感兴趣的:(oracle高级子查询练习题)