老杜MySql——34道作业题
老杜MySql链接:https://www.bilibili.com/video/BV1Vy4y1z7EX?p=132
本次随笔主要来源于老杜MySql讲解视频后面的作业题,加上个人的一些理解,以及整理;
部分较为简单就不进行收录了;
基本表的相关信息,以及部分实例数据:
emp
1.取得每个部门最高薪水的人员名称
(1)首先找到每个部门最高的薪水
select deptno,max(SAL) maxsal
from emp
group by deptno;
(2)将上述查询结果作为一个新表t,进行连接查询找出相关名字
select ename from emp e join t on e.sal=t.sal and e.deptno=t.deptno;
最终结果为:
select ename
from emp e
join (select DEPTNO,max(SAL) maxsal from EMP group by DEPTNO )t
on e.sal=t.sal and e.deptno=t.deptno;
2.哪些人的薪水在部门的平均的水平之上
(1)先找出每个部门的工资平均水平
select deptno,avg(asl) avgsal from emp group by deptno;
(2)与1同理
select ename from emp e join (select deptno,avg(SAL) avgsal from emp group by deptno )t on e.sal>t.avgsal and e.deptno=t.deptno;
需要注意点:连接条件中的t.avgsal,即采用了重命名的方式不可轻易修改,如果直接使用函数则会出错
3.取得部门所有人平均的薪资等级
(1)查出每个人薪水等级
select empno,grade from emp e,aslgrade s where e.sal between s.loasl and s.hisal;
(2)将查出的结果再次求平均
selece avg(t.grade) avggrade from (select empno,grade from emp e,aslgrade s where e.sal between s.loasl and s.hisal) t
3.1取得部门所有人平均薪水的等级
(1)取得所有人的平均薪水
select deptno,avg(asl) avgsal from emp;
(2)根据薪水确定等级
select grade from (select deptno,avg(asl) avgsal from emp) t,salgrade s where avg between s.logal and hisal;
4.不准用组函数(max),取得最高薪水(两种方法)
方法1:排序
select sal from emp order by sal desc limit 1;
方法2:表连接
思路:首先找出出了最高薪水以外其他的薪水()
select distinct e1.sal from emp e1 join emp e2 on e1.sal<e2.sal;
(2)将上述结果排除
select sal from emp where sal not in(
select distinct e1.sal
from
emp e1
join
emp e2
on e1.sal<e2.sal;
)
5.取得平均薪资最高的部门的部门编号(至少给出两种解决方案)
(1)求每个部门的平均薪资
select e.deptno,avg(sal) avgsal from emp e group by e.deptno;
(2)
select deptno,max(avgsal) from ( select e.deptno,avg(sal) avgsal from emp e group by e.deptno; )
其他方法为取最大值的部分使用order by desc limit 1;
官方做法:
select e.deptno,avg(sal) avgsal from emp e group by e.deptno order by avgsal limit 1;
其二:
6.取得平均薪资最高的部门的部门名称
同上
7.求平均薪水等级最低的部门名称
在此基础上加上连接
8.取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名
(0)出现在mgr字段上的代码
select distinct mgr from emp;
(1)求出普通员工的最高薪资水平
select max(sal) from emo e where empno not in(select distinct mgr from emp where mgr is not null);
关键点在于需要派除null 的存在,有null存在则所有的值变为null
(2)最终求解
select sal from emp where sal>( select max(sal) from emo e where empno not in(select distinct mgr from emp where mgr is not null) );
9.列出每个部门工作的员工数量,平均工资和平均服务期限
select d.deptno,count(e.ename),ifnull(avg(e.sal),0),avg(timestampdiff(YEAR,hiredate,now())) from emp e right join dept d on e.deptno=d.deptno group by d.deptno;
关键点 :计算日期之间差值的函数timestampdiff(YEAR,hiredate,now())
YEAR:间隔类型 hiredate:开始日期 now():结束日期
间隔类型的其他值:second 秒 minute 分钟 hour 小时 day天
week 星期 month 月 quarter季度