【76-95】34道作业题
2022-02-17 13:50:00
# MySQL
相关表
1 | mysql> select * from emp; |
1. 取得每个部门最高薪水的人员名称
1 | -- 取出每个部门最高薪水 |
2. 哪些人的薪水在部门平均薪水之上
1 | -- 每个部门的平均薪水 |
3. 取得部门中(所有人的)平均的薪水等级
- 平均的薪水等级: 先计算每一个薪水的等级,然后找出薪水等级的平均值
- 平均薪水的等级: 先计算平均薪水,然后找出每个平均薪水的等级值
1
2
3
4
5
6
7
8
9
10-- 求出每个人的薪水等级
select a.ename, a.sal, a.deptno, b.grade
from emp a, salgrade b
where a.sal between b.losal and b.hisal;
-- 取得部门中(所有人的)平均的薪水等级
select a.deptno, avg(b.grade)
from emp a, salgrade b
where a.sal between b.losal and b.hisal
group by a.deptno;
4. 不准用组函数(Max),取出最高薪水(给出两种解决方案)
第一种
1
select sal from emp order by sal desc limit 1;
第二种
1
2
3
4
5
6
7
8
9
10
11
12
13-- 表的自连接 可以发现没有出现最高薪水
select distinct a.sal
from emp a
join emp b
on a.sal < b.sal;
-- 取出最高薪水
select sal from emp where sal not in(
select distinct a.sal
from emp a
join emp b
on a.sal < b.sal
);
5. 取得平均薪水最高的部门的部门编号(至少给出两种解决方案)
第一种
1
select deptno, avg(sal) avgsal from emp group by deptno order by avgsal desc limit 1;
第二种
1
2
3
4
5
6
7
8
9
10
11-- 取出最高薪水
select max(a.avgsal)
from (select avg(sal) avgsal from emp group by deptno) a;
-- 取得平均薪水最高的部门的部门编号
select deptno, avg(sal) avgsal
from emp group by deptno
having avgsal = (
select max(a.avgsal)
from (select avg(sal) avgsal from emp group by deptno) a
);
6. 取出平均薪水最高的部门的部门名称
1 | -- 取出平均薪水最高的部门编号 |
7. 求平均薪水的等级最低的部门的部门名称
1 | -- 求每个部门平均薪水的最低的 |
8. 取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人名字
- not in(集合) 如果集合有空的话需要手动排除
1
2
3
4
5
6
7
8
9
10-- 取得普通员工的最高薪水
select max(sal) from emp
where empno not in(select distinct mgr from emp where mgr is not null);
-- 取得领导人名字
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. 取得薪水最高的前五名员工
1 | select ename, sal from emp order by sal desc limit 5; |
10. 取得薪水最高的第六道第十名员工
1 | select ename, sal from emp order by sal desc limit 5, 5; |
11. 取得最后入职的五名员工
1 | select ename, hiredate from emp order by hiredate desc limit 5; |
12. 取得每个薪水等级有多少员工
1 | select b.grade, count(b.grade) |
13. 面试题
有3个表 S(学生表),C(课程表), SC(学生选课表)
S (SNO, SNAME) 代表 (学号,姓名)
C (CNO, CNAME, CTEACHER) 代表 (课号, 课名, 教师)
SC (SNO, CNO, SCGRADE) 代表 (学号, 课号, 成绩)
问题:找出没选过”黎明”老师的所有学生姓名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29-- 找出"黎明"老师教的课号
select cno
from c
where cteacher = '黎明';
-- 找出"黎明"老师教的学生的学号
select distinct sc.sno
from sc
join (
select cno
from c
where cteacher = '黎明'
) t
on sc.cno = t.cno;
-- 找出没选过"黎明"老师的所有学生姓名
select s.sname
from s
where s.sno not in(
select distinct sc.sno
from sc
join (
select cno
from c
where cteacher = '黎明'
) t
on sc.cno = t.cno
);列出2门以上(含2门)不及格学生姓名及平均成绩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29-- 列出2门以上(含2门)不及格的学生学号
select sc.sno
from sc
where sc.scgrade < 60
group by sc.sno
having count(sc.cno) >= 2;
-- 列出每个学生的平均成绩
select sc.sno, avg(sc.scgrade) avggrade
from sc
group by sc.sno;
-- 列出2门以上(含2门)不及格学生姓名及平均成绩
select s.sname, j.avggrade
from (
select sc.sno
from sc
where sc.scgrade < 60
group by sc.sno
having count(sc.cno) >= 2
) i
left join s
on i.sno = s.sno
left join (
select sc.sno, avg(sc.scgrade) avggrade
from sc
group by sc.sno
) j
on i.sno = j.sno;即学过1号课程又学过2号课所有学生的姓名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25-- 学过1号课程的学生学号
select distinct sc.sno
from sc
where sc.cno = 1;
-- 学过2号课程的学生学号
select distinct sc.sno
from sc
where sc.cmo = 2;
-- 即学过1号课程又学过2号课所有学生的姓名
select s.sname
from (
select distinct sc.sno
from sc
where sc.cno = 1
) a
join (
select distinct sc.sno
from sc
where sc.cmo = 2
) b
on a.sno = b.sno
join s
on a.sno = s.sno;
14. 列出所有员工及领导的姓名
1 | select a.ename, ifnull(b.ename, "无上级") |
15. 列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
1 | select a.empno, a.ename, a.hiredate, b.empno, b.ename, b.hiredate, c.dname |
16. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
1 | select * |
17. 列出至少有五个员工的所有部门
1 | select b.* |
18. 列出薪水比”SMITH”多的所有员工信息
1 | select a.* |
19. 列出所有”CLERK”(办事员)的姓名及其部门名称,部门的人数
1 | -- 列出所有"CLERK"的姓名和部门编号 |
20. 列出最低薪金大于1500的各种工作及从事此工作的全部雇佣人数
1 | select a.job, count(*) |
21. 列出在部门”SALES”<销售部>工作的员工的姓名,假定不知道销售部的部门编号
1 | -- 找出销售部的部门编号 |
22. 列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级
1 | -- 高于平均薪水的所有员工 |
23. 列出与”SCOTT”从事相同工作的所有员工及部门名称
1 | -- 找出"SCOTT"从事的工作 |
24. 列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金
1 | -- 30部门员工的薪金 |
25. 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金,部门名称
1 | -- 在部门30工作的所有员工的最高薪金 |
26. 列出在每个部门工作的员工数量,平均工资和平均服务期限
- 函数TimeStampDiff(间隔类型,前一个日期,后一个日期)
- 间隔类型:SECOND秒,MINUTE分钟,HOUR小时,DAY天,WEEK星期,MONTH月,QUARTER季度,YEAR年
1
2
3
4
5select a.deptno, count(b.empno), ifnull(avg(b.sal),0), avg(TimeStampDiff(year, b.hiredate, now()))
from dept a
left join emp b
on a.deptno = b.deptno
group by a.deptno;
27. 列出所有员工的姓名、部门名称和工资
1 | select a.ename, b.dname, a.sal |
28. 列出所有部门的详细信息和人数
1 | -- 找出所有部门的人数 |
29. 列出各种工作的最低工资及从事此工作的雇员姓名
1 | -- 列出各种工作的最低工资 |
30. 列出各个部门的MANAGER(领导)的最低薪金
1 | select a.deptno, min(a.sal) |
31. 列出所有员工的年工资,按年薪从低到高排序
1 | select a.ename, (a.sal+ifnull(a.comm,0))*12 yearsal |
32. 求出员工领导的薪水超过3000的员工名称与领导名称
1 | select a.ename, b.ename, b.sal |
33. 求出部门名称中,带’S’字符的部门员工的工资合计、部门人数
1 | -- 找出部门名称中带'S'字符的部门 |
34. 给任职日期超过30年的员工加薪10%
1 | update emp a |