MySQL实战-基于emp,dept,salgrade表的34道题
- 1、取得每个部门最高薪水的人员名称
- 2、哪些人的薪水在部门的平均薪水之上
- 3、取得部门中(所有人的)平均的薪水等级
- 4、不准用组函数(Max),取得最高薪水(给出两种解决方案)
- 5、取得平均薪水最高的部门的部门编号(至少给出两种解决方案)
- 6、取得平均薪水最高的部门的部门名称
- 7、求平均薪水的等级最低的部门的部门名称
- 8、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名
- 9、取得薪水最高的前五名员工
- 10、取得薪水最高的第六到第十名员工
- 11、取得最后入职的5名员工
- 12、取得每个薪水等级有多少员工
- 13、面试题
- 14、列出所有员工及领导的姓名
- 15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
- 16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门.
- 17、列出至少有5个员工的所有部门
- 18、列出薪金比"SMITH"多的所有员工信息
- 19、列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数.
- 20、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数.
- 21、列出在部门"SALES"<销售部>工作的员工的姓名。
- 22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.
- 23、列出与"SCOTT"从事相同工作的所有员工及部门名称.
- 24、列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金.
- 25、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金.部门名称.
- 26、列出在每个部门工作的员工数量,平均工资和平均服务期限。
- 27、列出所有员工的姓名、部门名称和工资。(简单)
- 28、列出所有部门的详细信息和人数
- 29、列出各种工作的最低工资及从事此工作的雇员姓名
- 30、列出各个部门的“MANAGER(领导)”的最低薪金
- 31、列出所有员工的年工资,按年薪从低到高排序
- 32、求出员工领导的薪水超过3000的员工名称与领导名称
- 33、求出部门名称中,带'S'字符的部门员工的工资合计、部门人数.
- 34、给任职日期超过30年的员工加薪10%.
--emp表
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | NULL | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | NULL | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | NULL | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-02-04 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | NULL | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | NULL | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-09-06 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | NULL | 3000.00 | NULL | 20 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-08-09 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | NULL | 1250.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7566 | 1981-03-12 | 1250.00 | NULL | 30 |
| 7902 | FROD | ANALYST | 7782 | 1981-03-12 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7698 | NULL | 1300.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | NULL | 5000.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
--dept表
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.00 sec)
--salgrade表
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)
1、取得每个部门最高薪水的人员名称
--思路:
1、第一步先找出每个部门最大工资数
2、将1中的表当成临时表t,与emp e表进行连接。连接条件是:t.deptno=e.deptno and t.maxsal=e.sal
SELECT e.ename,e.sal,e.deptno FROM emp e JOIN
(select deptno,max(sal) as maxsal from emp group by deptno) t
ON e.deptno=t.deptno AND e.sal=t.maxsal;
+-------+---------+--------+
| ename | sal | deptno |
+-------+---------+--------+
| BLAKE | 2850.00 | 30 |
| SCOTT | 3000.00 | 20 |
| FROD | 3000.00 | 20 |
| KING | 5000.00 | 10 |
+-------+---------+--------+
4 rows in set (0.00 sec)
2、哪些人的薪水在部门的平均薪水之上
--思路
1、找出部门平均薪水(按照部门编号分组求平均值)
2、将查询结果当成临时表t,t表与emp e进行表连接 条件:t.deptno=e.deptno and e.sal>t.avgsal
SELECT e.ename,e.sal,t.* 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;
+-------+---------+--------+-------------+
| ename | sal | deptno | avgsal |
+-------+---------+--------+-------------+
| JONES | 2975.00 | 20 | 2205.000000 |
| BLAKE | 2850.00 | 30 | 1616.666667 |
| SCOTT | 3000.00 | 20 | 2205.000000 |
| FROD | 3000.00 | 20 | 2205.000000 |
| KING | 5000.00 | 10 | 2916.666667 |
+-------+---------+--------+-------------+
5 rows in set (0.00 sec)
3、取得部门中(所有人的)平均的薪水等级
--将所有人的薪水等级求出来再平均
--将emp e和salgrade s进行表连接,连接条件是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;
+--------+--------------+
| deptno | avg(s.grade) |
+--------+--------------+
| 10 | 3.6667 |
| 20 | 3.0000 |
| 30 | 2.6667 |
+--------+--------------+
3 rows in set (0.00 sec)
变形:取得部门中(所有人的)平均的 薪水等级。(没有的)
--先求各部门平均薪水,再求对应的等级
--从emp e中取出deptno,avg(sal)并将其看作临时表t
--将t和salgrade s进行表连接,连接条件是t.avgsal BETWEEN s.losal AND s.hisal
SELECT t.*,s.grade FROM salgrade s JOIN
(SELECT deptno,avg(sal) avgsal FROM emp GROUP BY deptno) t
ON t.avgsal BETWEEN s.losal AND s.hisal;
+--------+-------------+-------+
| deptno | avgsal | grade |