@MySQL经典34道题
动力节点34道MySQL经典练习题
手动敲代码,不敲代码不是一名合格的程序员!!!
下面是bjpowernode的sql文件,进入MySQL然后source导入下就可以练习了哈
链接:https://pan.baidu.com/s/1TLt4pzGZC4pQEvp4JKtF1Q
提取码:pray
1、取得每个部门最高薪水的人员名称
select deptno,max(sal) as maxsal from emp group by deptno;//把这个当作零时表t看待;
select
e.ename,t.*
from
(select deptno,max(sal) as maxsal from emp group by deptno) t
join
emp e
on
t.deptno=e.deptno and t.maxsal=e.sal;
2、哪些人的薪水在部门的平均薪水之上
先找出每个部门的平均薪水
select deptno,avg(sal) from emp as avgsal group by deptno;
将以上的表当作t表,t表与emp表进行连接
select
t.*, e.ename, e.sal
from
emp e
join
(select deptno,avg(sal) as avgsal from emp group by deptno) t
on
e.deptno=t.deptno and e.sal>t.avgsal;
思路:既然要找哪些人薪水在部门平均水平之上,那就找每个部门的平均薪水,以部门编号划分,然后以这张表作为零时表t,与emp表进行连接,要找出员工名称,员工薪水以及所在部门编号,用join on 连接,on后面跟条件,e表和t表要相等并且e表的sal要比t表的avgsal要高。
3、取得部门中所有人平均的薪水等级,
注意:
平均的薪水等级:先计算所有的平均薪水,然后计算薪水的等级;
平均薪水的等级:先计算每一个薪水的等级,然后计算出所有等级的平均;
思路:先找出每个人的薪水等级;emp e和salgrade s 表相连,连接条件:e.sal between s.local and s.hisal;
select
e.ename,e.sal,e.deptno,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
然后计算每个平均的薪水等级
select
e.deptno,avg(s.grade)
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal
group by
e.deptno;
4、不用组函数(max),取得最高薪水
第一种(降序,取第一个):select ename,sal from emp order by sal desc limit 1;
第二种(max):select max(sal) from emp;
第三种:表的自连接
select sal from emp where sal not in(
select
distinct a.sal
from
emp a
join
emp b
on
a.sal<b.sal); (找出a表里面小于b表的工资,distinct代表去重)
5、取得平均薪水最高的部门的部门编号;(给出两种解决方案)
1、select deptno,avg(sal) as avgsal from emp group by deptno order by avgsal desc limit 1;