afightz

老杜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季度      

 

posted on 2022-05-13 16:47  清风微影  阅读(244)  评论(0编辑  收藏  举报

导航