代码改变世界

Oracle高级查询练习题2

2020-03-15 16:16  默默不语  阅读(552)  评论(0编辑  收藏  举报
--1.查询平均工资最高的部门的部门编号,部门名称,和该部门的平均工资
select d.deptno,d.dname,t.pingjun from dept d inner join(
       select deptno,round(avg(sal+nvl(comm,0))) pingjun from emp group by deptno
)t on d.deptno=t.deptno where t.pingjun=(
   select max(round(avg(sal+nvl(comm,0))))from emp group by deptno
);
--2 查询所有员工的年薪,所在部门的名称,结果按年薪低到高排列
select e.ename,d.dname,round((sal+nvl(comm,0))*12) as nianxin from emp e inner join dept d on e.deptno=d.deptno order by nianxin desc;
--3查询每种工作的工作名称,最低工资,领取该最低工资员工的姓名
select t.job,t.minsal,e.ename,e.sal from (
      select job,min(sal) as minsal from emp group by job 
)t inner join emp e on t.job=e.job where e.sal=t.minsal;
--4查询出管理员工人数最多的人和他管理的人的名字
select e2.ename, e1.ename, t.人数
  from (select count(e.ename) as 人数, e.mgr from emp e group by e.mgr) t
 inner join emp e1
    on t.mgr = e1.empno
 inner join emp e2
    on e2.mgr = t.mgr
 where t.人数 =
       (select max(count(e1.ename)) as max_num from emp e1 group by e1.mgr)

--5查询所有员工的编号、姓名,及其上级领导的编号、姓名。显示结果按领导的年薪降序排列
select e1.empno,e1.ename,e2.empno,e2.ename,(e2.sal+nvl(e2.comm,0))*12 nianxin from emp e1 inner join emp e2 on e1.mgr=e2.empno order by nianxin desc;
--6查询所有领取奖金和不领取奖金的员工人数、平均工资;查询结果的列名分别为:人数、平均工资;第一行为有奖金的员工,第二行为没有奖金的员工
select count(ename) 人数,avg(sal+nvl(comm,0)) from emp where nvl(comm,0)!=0 
union
select count(ename) 人数,avg(sal+nvl(comm,0)) from emp where nvl(comm,0)=0 
--7查询工资不超过2500的人数最多的部门名称和该部门工资不超过2500的员工的员工人数
select d1.dname,t.renshu from dept d1 inner join (
       select deptno,count(ename) renshu from emp where (sal+nvl(comm,0))<2500 group by deptno
)t on d1.deptno=t.deptno where t.renshu=(
   select max(count(ename)) renshu from emp where (sal+nvl(comm,0))<2500 group by deptno
);
--8查询受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
select e1.empno,e1.ename,d.dname from emp e1 
inner join emp e2 on e1.mgr=e2.empno
inner join dept d on e1.deptno=d.deptno where e1.hiredate<e2.hiredate;
--10查询工资比“SMITH”高的员工的基本信息
select * from emp where sal>(
       select sal from emp where ename='SMITH'
);
--9查询至少有4个员工的部门的部门名称
select d.dname from emp e inner join dept d on e.deptno=d.deptno group by e.deptno,d.dname having count(ename)>3; 
--11查询部门名称中带'S'字符的部门的员工的工资总和部门人数,显示结果为部门名称,部门员工的工资总和,部门人数
--不推荐使用d.dname分组,因为可能dname不唯一
select d.dname 部门名称,sum(e.sal+nvl(e.comm,0)) 工资总和,count(e.ename) 部门人数 from dept d left outer join emp e on d.deptno=e.deptno where d.dname like '%S%' group by d.dname;

--更优化
select d.dname, b.r, b.s
  from dept d
  left join (select count(rowid) r, sum(sal+nvl(comm,0)) s, deptno
               from emp
              group by deptno) b
    on d.deptno = b.deptno
 where d.dname like '%S%';
--12查询所有从事"CLERK"工作的雇员所在部门的部门名称、部门里的人数
select d.dname,count(ename) from dept d inner join emp e on d.deptno=e.deptno where d.deptno in(
    select distinct(deptno) from emp where job='CLERK'   
) group by d.dname; 
--13查询雇员领导的基本信息,要求领导的薪水要超过3000
select * from emp where empno=(
       select e1.mgr from emp e1 inner join emp e2 on e1.mgr=e2.empno where e2.sal>3000 group by e1.mgr
);
--14查询在"sales"部门(销售部)工作的员工的姓名
select e.* from emp e inner join dept d on e.deptno=d.deptno where d.dname='SALES';
--15查询工资高于30号部门的所有员工的工资的员工姓名、工资及部门名称
select e.ename,(e.sal+nvl(comm,0)),d.dname from emp e inner join dept d on e.deptno=d.deptno where (e.sal+nvl(comm,0))>all(
       select sal from emp where deptno=30
); 
--16查询所有部门的详细信息(部门编号、部门名称)和部门人数
select d.deptno,d.dname,count(e.ename) from dept d inner join emp e on d.deptno=e.deptno group by d.deptno,d.dname;
--17显示每个部门中每个岗位的平均工资、每个部门的平均工资、每个岗位的平均工资(没看懂题目要求,好像有点问题)

--18显示与"BLAKE"同部门的所有员工的基本信息,但不显示"BLAKE"的基本信息
select * from emp where deptno =(
       select deptno from emp where ename='BLAKE'
) and ename<>'BLAKE';
--19查询出“KING”所在部门的部门编号、部门名称以及该部门里的员工人数
select t.deptno,d.dname,t.renshu from(
       select e.deptno,count(e.ename) renshu from emp e group by e.deptno
)t left join dept d on t.deptno=d.deptno where t.deptno=(
       select deptno from emp where ename='KING'
)
--20查询出"WARD"所在部门的工作年限最大的员工的姓名
select t.ename from( 
  select ename,round(sysdate-hiredate) worktime from emp where deptno=(
         select deptno from emp where ename='WARD'
  )
)t where t.worktime=(
   select max(round(sysdate-hiredate)) worktime from emp where deptno=(
         select deptno from emp where ename='WARD'
  )
)
--21查询出没有下属的员工的姓名及他的职位
select e1.ename,e1.job from emp e1 left outer join emp e2 on e1.empno=e2.mgr where e2.empno is null;
--22查询出员工姓名以A开头的人数最多的部门的部门名称
select * from dept d inner join (
       select deptno,count(ename) renshu from emp where ename like 'A%' group by deptno
)t on d.deptno=t.deptno where t.renshu=(
   select max(count(ename)) from emp where ename like 'A%' group by deptno
)
--23查询出SMITH所在部门的部门名称、部门工资的平均值
select e.deptno,round(avg(e.sal+nvl(e.comm,0))) pingjun from emp e where d.deptno=(
      select deptno from emp where ename='SMITH'
) group by d.deptno;