mysql 34道作业题

mysql 34道作业题

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

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

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

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

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) as avgsal from emp group by deptno;

第二步:将以上查询结果当做t表,t表和emp表连接

条件:部门编号相同,并且emp的sal大于t表的avgsal

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;

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

平均的薪水等级:先计算每一个薪水的等级,然后找出薪水等级的平均值。

平均薪水的等级:先计算平均薪水,然后找出每个平均薪水的等级值。

第一步:找出每个人的薪水等级

emp e和salgrade s表连接

条件:e.sal between s.losal 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;

第二步:基于以上结果继续按照deptno分组,求grade的平均值。

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),取得最高薪水

第一种方案:sal降序,limit 1

select ename,sal from emp order by sal desc limit 1;

第二种方案: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);

5、取得平均薪水最高的部门编号

第一种方案:降序取第一个

第一步:找出每个部门的平均薪水

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

第二步:降序选第一个

select deptno,avg(sal) as avgsal from emp group by deptno order by avgsal desc limit 1;

第二种方案:max

select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t;

select

​ deptno,avg(sal) as avgsal

from

​ emp

group by

​ deptno

having

​ avgsal = (select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t);

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

select

​ d.dname,avg(e.sal) as avgsal

from

​ emp e

join

​ dept d

on

​ e.deptno = d.deptno

group by

​ d.dname

order by

​ avgsal desc

limit

​ 1;

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

第一步:找出每个部门的平均薪水

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

第二步:找出每个部门的平均薪水的等级

以上t表和salgrade表连接,条件:t.avgsal between s.losal and s.hisal

select

​ t.*,s.grade

from

​ (select d.dname,avg(sal) as avgsal from emp e join dept d on e.deptno = d.deptno group by d.dname) t

join

​ salgrade s

on

​ t.avgsal between s.losal and s.hisal

where

​ s.grade = (select grade from salgrade where (select avg(sal) as avgsal from emp group by deptno order by avgsal asc limit 1));

8、取得比普通员工的最高薪水还要高的领导人姓名

第一步:找出普通员工的最高薪水

select max(sal) from emp where empno not in(select distinct mgr from emp where mgr is not null); //not in在使用的时候,后面小括号中记得排除null

第二步:找出高于1600的

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

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

select ename,sal from emp order by sal desc limit 5;

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

select ename,sal from emp order by sal desc limit 5,5;

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

日期也可以升序降序

select ename,hiredate from emp order by hiredate desc limit 5;

12、取得每个薪水等级有多少员工

分组count

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

select

​ e.ename,e.sal,s.grade

from

​ emp e

join

​ salgrade s

on

​ e.sal between s.losal and s.hisal;

第二步:继续按照grade分组统计数量

select

​ e.ename,e.sal,s.grade

from

​ emp e

join

​ salgrade s

on

​ e.sal between s.losal and s.hisal

group by

​ s.grade;

13、面试题

14、列出所有员工及领导的姓名

select

​ a.ename'员工',b.ename'领导'

from

​ emp a

left join

​ emp b

on

​ a.mgr = b.empno;

15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称

emp a 员工表

emp b 领导表

a.mgr = b.empno and a.hiredate < b.hiredate

select

​ a.ename'员工‘,a.hiredate,b.ename'领导’,b.hiredate,d.dname

from

​ emp a

join

​ emp b

on

​ a.mgr = b.empno

join

​ dept d

on

​ a.deptno = d.deptno

where

​ a.hiredate < b.hiredate;

16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

select

​ e.*,d.dname

from

​ emp e

right join

​ dept d

on

​ e.deptno = d.deptno;

17、列出至少有5个员工的所有部门

按照部门编号分组,计数,筛选出>=5

select

​ deptno

from

​ emp

group by

​ deptno

having

​ count(*)>=5;

18、列出薪金比“SMITH"多的所有员工信息

select ename,sal from emp where sal >(select sal from emp where ename ='SMITH');

19、列出所有“CLERK”(办事员)的姓名及其部门名称,部门人数

select

​ t1.*,t2.deptcount

from

​ (select

​ ​ e.ename,e.job,d.dname,d.deptno

​ from

​ ​ emp e

​ join

​ ​ dept d

​ on

​ e.deptno = d.deptno

​ where

​ e.job = 'CLERK') t1

join

​ (select deptno,count(*) as deptcount from emp group by deptno) t2

on

​ t1.deptno = t2.deptno;

20、列出最低薪资大于1500的各种工作及从事次工作的全部雇员人数

select job,count(*) from emp group by job having min(sal) > 1500;

21、列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号

select ename from emp where deptno = (select deptno from dept where dname = 'SALES');

22、列出薪资高于公司平均薪资的所有员工,所在部门,上级领导,雇员的工资等级

select

​ ​ e.ename'员工‘,d.dname,1.ename'领导',s.grade

from

​ ​ emp e

join

​ ​ dept d

on

​ ​ e.deptno = d.deptno

left join

​ ​ emp 1

on

​ ​ e.mgr = 1.empno

join

​ ​ salgrade s

on

​ ​ e.sal between s.losal and s.hisal

where

​ ​ e.sal > (select avg(sal) from emp);

23、列出与“SCOTT”从事相同工作的所有员工及其部门名称

select

​ ​ e.ename,e.job,d.dname

from

​​ emp e

join

​​ dept d

on

​ ​ e.deptno = d.deptno

where

​ ​ e.job = (select job from emp where ename = 'SCOTT')

and

​​ e.ename<>'SCOTT';

24、列出薪资等于部门30中员工的薪资的其他员工的姓名和薪资

select

​​ ename,sal

from

​​ emp

where

​​ sal in(select distinct sal from emp where deptno = 30)

and

​​ deptno<>30;

25、列出薪资高于在部门30工作的所有员工的薪资的员工姓名和薪资,部门名称

select

​ ​ e.ename,e.sal,d.dname

from

​ ​ emp e

join

​ ​ dept d

on

​ ​ e.deptno = d.deptno

where

​​ e.sal>(select max(sal) from emp where deptno =30);

26、列出在每个部门工作的员工数量,平均工资和平均服务期限

select

​ ​ d.deptno,count(e.ename) ecount,ifnull(avg(e.sal),0) as avgsal,ifnull(avg(timestampdiff(YEAR,hiredate,now)),0) as avgservicetime

from

​ ​ emp e

right join

​​ dept d

on

​ ​ e.deptno = d.deptno

group by

​​ d.deptno;

27、列出所有员工的姓名、部门名称和工资

select

​ ​ e.ename,d.dname,e.sal

from

​ ​ emp e

join

​​ dept d

on

​ ​ e.deptno = d.deptno;

28、列出所有部门的详细信息和人数

select

​​ d.deptno,d.dname,d.loc,count(e.ename)

from

​​ emp e

right join

​​ dept d

on

​​ e.deptno = d.deptno

group by

​​ d.deptno,d.dname,d.loc;

29、列出各种工作的最低工资及从事此工作的雇员姓名

select

​ ​ job,min(sal) as minsal

from

​ ​ emp

group by

​ ​ job;

emp e和以上t连接

select

​ ​ e.ename,t.*

from

​ ​ emp e

join

​ ​ (select

​ job,min(sal) as minsal

​​ from

​ ​ emp

​​ group by

​ ​ job) t

on

​​ e.job = t.job and e.sal =t.minsal;

30、列出各个部门的MANAGER的最低薪资

select

​​ deptno,min(sal)

from

​ ​ emp

where

​ ​ job = 'MANAGER'

group by

​ ​ deptno;

31列出所有员工的年薪资,按年薪从低到高排序

select

​ ​ ename,(sal + ifnull(comm,0) ) * 12 as yearsal

from

​ ​ emp

order by

​ ​ yearsal asc;

32、求出员工领导薪水超过3000的员工名称与领导

select

​ ​ a.ename'员工',b.ename'领导'

from

​ ​ emp a

join

​ ​ emp b

on

​ ​ a.mgr = b.empno

where

​ ​ b.sal >3000;

33、求出部门名称中带'S'字符的部门员工的工资合计,部门人数

select

​ ​ d.deptno,d.dname,d.loc,count(e.ename),ifnull(sum(e.sal),0) as sumsal

from

​ ​ emp e

right join

​ ​ dept d

on

​ ​ e.deptno = d.deptno

where

​ ​ d.dname like '%s%'

group by

​ ​ d.deptno,d.dname,d.loc;

34、给任职日期超过30年的员工加薪10%

update emp set sal = sal * 1.1 where timestampdiff(YEAR,hiredate,now()) > 30

posted @ 2021-04-26 16:10  飞翔奥尔良烤翅  阅读(525)  评论(0)    收藏  举报