正在玩命加载中 . . .

TestForDatabase


练习

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

第一步:取得每个部门的最高薪水(按照部门编号分组,找出每一组的最大值)

select deptno,max(sal) as maxsal from emp group by deptno;

+——–+———-+
| deptno | max(sal) |
+——–+———-+
| 20 | 3000.00 |
| 30 | 2850.00 |
| 10 | 5000.00 |
+——–+———-+

第二步:将以上的查询结果当做一张临时表 t,t和emp表连接,连接条件是:t.deptno = e.deptno and t.maxsal = e.sal

select e.ename,t.* 
from emp e
join (select deptno,max(sal) as maxsal from emp group by deptno ) t
on t.deptno = e.deptno and t.maxsal = e.sal;

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

第一步:取得每个部门的平均薪水(按照部门编号分组,找出每一组的平均值)

select deptno,avg(sal) as avgsal from emp group by deptno;

+——–+————-+
| deptno | avgsal |
+——–+————-+
| 20 | 2175.000000 |
| 30 | 1566.666667 |
| 10 | 2916.666667 |
+——–+————-+

第二步:将以上的查询结果当做一张临时表 t,t 和 emp表连接,连接条件是:t.deptno = e.deptno and t.avgsal < e.sal

select e.ename,e.sal 
from emp e
join (select deptno,avg(sal) as avgsal from emp group by deptno ) t
on t.deptno = e.deptno and t.avgsal < e.sal;

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

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

select e.ename,e.deptno,e.sal,s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;

+——–+———+——-+——–+
| ename | sal | grade | deptno |
+——–+———+——-+——–+
| SMITH | 800.00 | 1 | 20 |
| ALLEN | 1600.00 | 3 | 30 |
| WARD | 1250.00 | 2 | 30 |
| JONES | 2975.00 | 4 | 20 |
| MARTIN | 1250.00 | 2 | 30 |
| BLAKE | 2850.00 | 4 | 30 |
| CLARK | 2450.00 | 4 | 10 |
| SCOTT | 3000.00 | 4 | 20 |
| KING | 5000.00 | 5 | 10 |
| TURNER | 1500.00 | 3 | 30 |
| ADAMS | 1100.00 | 1 | 20 |
| JAMES | 950.00 | 1 | 30 |
| FORD | 3000.00 | 4 | 20 |
| MILLER | 1300.00 | 2 | 10 |
+——–+———+——-+——–+
14 rows in set (0.00 sec)

第二步:根据上表,在按照deptno分组,求grade的平均值

select e.deptno,avg(grade)
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
group by e.deptno;

+——–+————+
| deptno | avg(grade) |
+——–+————+
| 20 | 2.8000 |
| 30 | 2.5000 |
| 10 | 3.6667 |
+——–+————+
3 rows in set (0.00 sec)

4、不用组函数Max,取得最高薪水


文章作者: LogicVan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LogicVan !
评论
  目录