oracle 函数 测试题,Oracle经典练习题

Oracle经典练习题

1、取得每个部门最高薪水的人员名称

第一步:取得每个部门的最高薪水

select deptno, max(sal) maxSal from emp group by deptno

第二步:获取结果

select ename, sal, e.deptno from emp e join ( select deptno, max(sal) maxSal from emp group bydeptno) t on e.deptno = t.deptno and e.sal = t.maxSal

17755fe69f72c0332718dc71d62bd6bf.png

2、哪些人的薪水在部门的平均薪水之上

第一步:获取每个部门的平均薪水

select deptno, avg(sal) avgSal from emp group by deptno

第二步:获取结果

select ename, sal from emp e join (select deptno, avg(sal) avgSal from emp group by deptno) t on e.deptno = t.deptno and e.sal > t.avgSal

937413d9b4cd723697aa3ff61460a4a1.png

3、取得部门中(所有人的)平均的薪水等级,如下:

第一步:获取每个员工的薪水等级

select deptno, grade from emp e join salgrade g on e.sal between g.LOSAL and g.HISAL

第二步:将第一步的结果用部门编号进行分组,得到结果

select deptno, avg(grade) from (select deptno, grade from emp e join salgrade g on e.sal between g.LOSAL and g.HISAL) group by deptno

39c02b6cb297ccf3fa8ba17a6404e970.png

4、不准用组函数(Max),取得最高薪水(给出两种解决方案)

第一种(rownum):

● 将员工薪水降序排列

select * from emp order by sal desc

● 取得查询结果的第一条数据

select sal from ( select * from emp order by sal desc) where rownum = 1

第二种(自关联)

● 将Emp表当成2张表来用,进行比较,得到最大值以外的值。

select distinct e.sal from emp e join emp t on e.sal < t.sal

● 获取最大薪水

select sal from emp where sal not in (select distinct e.sal from emp e join emp t on e.sal < t.sal)

afd4ae849735045bbfacb31b367bdc7e.png

5、取得平均薪水最高的部门的部门编号(至少给出两种解决方案)

第一种:

select * from (select deptno from emp group by deptno order by avg(sal) desc) where rownum = 1

第二种:

● 获取每个部门的平均薪水

select deptno, avg(sal) from emp group by deptno

● 取得查询结果的最高数据

select max(avgSal) from (select deptno, avg(sal) avgSal from emp group by deptno)

● 取得结果

select deptno from (select deptno, avg(sal) avgSal from emp group by deptno) s join (select max (avgSal) maxAvgSal from (select deptno, avg(sal) avgSal from emp group by deptno)) t on s.avgSal = t.maxAvgSal

第三种(聚合函数可以嵌套使用)

select deptno from emp group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno);

929a91dfecd9ff8334fcb4f9498184d8.png

6、取得平均薪水最高的部门的部门名称

● 参考上一题的结果(取得部门编号)

select deptno from emp group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno);

● 取得部门名称

Select dname from dept where deptno = (select deptno from emp group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno))

1aec1b5e75edd67bfddb3f2e2f00a3a4.png

7、求平均薪水的等级最低的部门的部门名称

第一步:取得每个部门的平均薪水

select deptno, avg(sal) avgSal from emp group by deptno

第二步:获取每个部门的平均 薪水等级

select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal

第三步:取得最低的等级

select min(grade) from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal)

第四步:获取部门编号

Select deptno from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal) where grade = (select min(grade) from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal))

第五步:取得部门名称

Select dname from dept where deptno in (Select deptno from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal) where grade = (select min(grade) from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal)))

0a1439a8b6304008fd05d632602e8c65.png

8、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的经理人姓名

第一步:取得所有经理的员工编号

select distinct mgr from emp where mgr is not null

第二步:取得普通员工的最高薪水

Select max(sal) maxSal from emp where empno not in (select distinct mgr from emp where mgr is not null )

第三步:获取结果

select ename , sal from emp where empno in (select distinct mgr from emp where mgr is not null) and sal > (Select max(sal) maxSal from emp where empno not in (select distinct mgr from emp where mgr is not null ))

126baf491b96c0dabaccc545ab6b21c4.png

9、取得薪水最高的前五名员工

select *

from

(

select rownum r, t.*

from

(

Select ename, sal from emp order by sal desc

) t

where rownum <=5

)where r>0

6e48304db61b162b19a2b656192fbd3d.png

10、取得薪水最高的第六到第十名员工

select *

from

(

select rownum r, t.*

from

(

Select ename, sal from emp order by sal desc

) t

where rownum <=10

)where r>5

c4219c1adc80b1a545066f563d98165a.png

11、取得最后入职的5名员工

Select * from ( select ename, hiredate from emp order by hiredate desc ) where rownum <= 5

6f82710c366460c12bd8f4c7c23ea1b2.png