文章目录
- 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%
【1】此博客整理自B站老杜34道作业题;视频链接:https://www.bilibili.com/video/BV1Vy4y1z7EX?p=132
【2】关于B站老杜的MySQL配套文档获取链接:https://pan.baidu.com/s/1mH5nMMv1YWLtd4xromvnsA
【3】关于本篇博客习题详解的电子文档获取链接:https://pan.baidu.com/s/1EXNV5In7mkuoSvpeMiSvpg
【4】关于百度网盘的提取码:请关注VX公宗浩zdb呀后台回复关键字提取码获取
【5】整理不易,如链接失效,请联系本人
1、取得每个部门最高薪水的人员名称
步骤一:先查询每个部门的最高工资
mysql> select deptno,max(sal) as maxsal from emp group by deptno;
+--------+---------+
| deptno | maxsal |
+--------+---------+
| 10 | 5000.00 |
| 20 | 3000.00 |
| 30 | 2850.00 |
+--------+---------+
3 rows in set (0.00 sec)
步骤二:把上面查询结果当成一张表,查询符合上表情况的人
select
e.ename, t.*
from
emp e
join
(select deptno,max(sal) as maxsal from emp group by deptno) t
on
t.deptno=e.deptno and t.maxsal=e.sal;
+-------+--------+---------+
| ename | deptno | maxsal |
+-------+--------+---------+
| BLAKE | 30 | 2850.00 |
| SCOTT | 20 | 3000.00 |
| KING | 10 | 5000.00 |
| FORD | 20 | 3000.00 |
+-------+--------+---------+
4 rows in set (0.00 sec)
2、哪些人的薪水在部门的平均薪水之上
步骤一:查询每个部门的平均薪资
mysql> select deptno,avg(sal) as avg_sal from emp group by deptno;
+--------+-------------+
| deptno | avg_sal |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
3 rows in set (0.00 sec)
步骤二:获取大于平均薪资的人
mysql> select e.ename, e.sal
-> from emp e
-> join (select deptno,avg(sal) as avg_sal from emp group by deptno) t
-> on e.deptno=t.deptno and e.sal>t.avg_sal;
+-------+---------+
| ename | sal |
+-------+---------+
| ALLEN | 1600.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)
3、取得部门中(所有人的)平均的薪水等级
步骤一:获取每个人的薪资等级
mysql> select e.deptno,e.ename, s.grade
-> from emp e
-> join salgrade s
-> on e.sal between s.losal and s.hisal;
+--------+--------+-------+
| deptno | ename | grade |
+--------+--------+-------+
| 20 | SMITH | 1 |
| 30 | ALLEN | 3 |
| 30 | WARD | 2 |
| 20 | JONES | 4 |
| 30 | MARTIN | 2 |
| 30 | BLAKE | 4 |
| 10 | CLARK | 4 |
| 20 | SCOTT | 4 |
| 10 | KING | 5 |
| 30 | TURNER | 3 |
| 20 | ADAMS | 1 |
| 30 | JAMES | 1 |
| 20 | FORD | 4 |
| 10 | MILLER | 2 |
+--------+--------+-------+
14 rows in set (0.01 sec)
步骤二:基于上述结果分组
mysql> 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 | 2.8000 |
| 30 | 2.5000 |
+--------+--------------+
3 rows in set (0.00 sec)
4、不准用组函数(Max),取得最高薪水
方法一:desc降序排序,limit显示第一条数据
mysql> select sal from emp order by sal desc limit 1;
+---------+
| sal |
+---------+
| 5000.00 |
+---------+
1 row in set (0.00 sec)
方法二:表的自连接
mysql> select distinct a.sal from emp a join emp b where a.sal<b.sal;
+---------+
| sal |
+---------+
| 800.00 |
| 1250.00 |
| 1500.00 |
| 1100.00 |
| 950.00 |
| 1300.00 |
| 1600.00 |
| 2850.00 |
| 2450.00 |
| 2975.00 |
| 3000.00 |
+---------+
11 rows in set (0.00 sec)
mysql> select sal from emp
-> where sal not in (select distinct a.sal from emp a join emp b where a.sal<b.sal);
+---------+
| sal |
+---------+
| 5000.00 |
+---------+
1 row in set (0.00 sec)
5、取得平均薪水最高的部门的部门编号
方法一
步骤一:获取每个部门的平均薪资
mysql> select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
3 rows in set (0.00 sec)
步骤二:排序
select t.deptno
from (select deptno,avg(sal) as avg_sal from emp group by deptno) t
order by t.avg_sal desc
limit 1;
+--------+
| deptno |
+--------+
| 10 |
+--------+
1 row in set (0.00 sec)
方法二:max
select t.deptno,max(t.avg_sal)
from (select deptno,avg(sal) as avg_sal from emp group by deptno) t;
6、取得平均薪水最高的部门的部门名称
步骤一:获取平均薪资最高的部门
mysql> select deptno,avg(sal) avg_sal from emp group by deptno order by avg_sal desc limit 1;
+--------+-------------+
| deptno | avg_sal |
+--------+-------------+
| 10 | 2916.666667 |
+--------+-------------+
1 row in set (0.00 sec)
步骤二:内连接两张表
mysql> select d.dname
-> from dept d
-> join (select deptno,avg(sal) avg_sal from emp group by deptno order by avg_sal desc limit 1) t
-> on d.deptno=t.deptno;
+------------+
| dname |
+------------+
| ACCOUNTING |
+------------+
1 row in set (0.00 sec)
7、求平均薪水的等级最低的部门的部门名称
步骤一:先求部门的平均薪资
mysql> select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
3 rows in set (0.00 sec)
步骤二:再求部门的平均薪资对应的等级
mysql> select e.deptno, s.grade
-> from (select deptno,avg(sal) avg_sal from emp group by deptno) e
-> join salgrade s
-> on e.avg_sal between s.losal and s.hisal;
+--------+-------+
| deptno | grade |
+--------+-------+
| 30 | 3 |
| 10 | 4 |
| 20 | 4 |
+--------+-------+
3 rows in set (0.00 sec)
步骤三:内连接部门名称表
select e.deptno, s.grade, d.dname
from (select deptno,avg(sal) avg_sal from emp group by deptno) e
join salgrade s
on e.avg_sal between s.losal and s.hisal
join dept d
on d.deptno = e.deptno;
+--------+-------+------------+
| deptno | grade | dname |
+--------+-------+------------+
| 30 | 3 | SALES |
| 10 | 4 | ACCOUNTING |
| 20 | 4 | RESEARCH |
+--------+-------+------------+
3 rows in set (0.00 sec)
步骤四:排序
select d.dname
from (select deptno,avg(sal) avg_sal from emp group by deptno) e
join salgrade s
on e.avg_sal between s.losal and s.hisal
join dept d
on d.deptno = e.deptno
order by s.grade limit 1;
+-------+
| dname |
+-------+
| SALES |
+-------+
1 row in set (0.00 sec)
8、取得比普通员工(员工代码没有在 mgr 字段上出现的)的最高薪水还要高的 领导人姓名
步骤一:先找到所有的领导员工
mysql> select distinct mgr from emp;
+------+
| mgr |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| NULL |
| 7788 |
| 7782 |
+------+
7 rows in set (0.00 sec)
注意:必须排除null
mysql> select distinct mgr from emp where mgr is not null;
+------+
| mgr |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| 7788 |
| 7782 |
+------+
6 rows in set (0.00 sec)
步骤二:找出不同员工在最高薪资
mysql> select max(sal)
-> from emp
-> where empno not in (select distinct mgr from emp where mgr is not null);
+----------+
| max(sal) |
+----------+
| 1600.00 |
+----------+
1 row in set (0.00 sec)
步骤三:找出高于此薪资的
注意:比普通员工薪资还要高的一定是领导
select ename
from emp
where sal>(select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null));
+-------+
| ename |
+-------+
| JONES |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| FORD |
+-------+
6 rows in set (0.00 sec)
9、取得薪水最高的前五名员工
mysql> select ename,sal from emp order by sal desc limit 5;
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+
5 rows in set (0.00 sec)
10、取得薪水最高的第六到第十名员工
mysql> select ename,sal from emp order by sal desc limit 5,5; //第一个参数表示开始的索引,默认从0开始 //第二个参数表示长度
+--------+---------+
| ename | sal |
+--------+---------+
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
+--------+---------+
5 rows in set (0.00 sec)
11、取得最后入职的 5 名员工
mysql> select ename,hiredate from emp order by hiredate desc limit 5;
+--------+------------+
| ename | hiredate |
+--------+------------+
| ADAMS | 1987-05-23 |
| SCOTT | 1987-04-19 |
| MILLER | 1982-01-23 |
| FORD | 1981-12-03 |
| JAMES | 1981-12-03 |
+--------+------------+
5 rows in set (0.00 sec)
12、取得每个薪水等级有多少员工
步骤一:获取每个员工薪资的等级
select e.sal, s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;
+---------+-------+
| sal | grade |
+---------+-------+
| 800.00 | 1 |
| 1600.00 | 3 |
| 1250.00 | 2 |
| 2975.00 | 4 |
| 1250.00 | 2 |
| 2850.00 | 4 |
| 2450.00 | 4 |
| 3000.00 | 4 |
| 5000.00 | 5 |
| 1500.00 | 3 |
| 1100.00 | 1 |
| 950.00 | 1 |
| 3000.00 | 4 |
| 1300.00 | 2 |
+---------+-------+
14 rows in set (0.00 sec)
步骤二:计数
select s.grade, count(*)
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
group by s.grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
| 1 | 3 |
| 2 | 3 |
| 3 | 2 |
| 4 | 5 |
| 5 | 1 |
+-------+----------+
5 rows in set (0.00 sec)
13、面试题
14、列出所有员工及领导的姓名
自关联,外连接
select e.ename '员工', e2.ename '领导'
from emp e
left join emp e2
on e.mgr = e2.empno;
+--------+-------+
| 员工 | 领导 |
+--------+-------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| KING | NULL |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+-------+
14 rows in set (0.00 sec)
15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
步骤一:找到每个员工的编号,姓名,部门名称
mysql> select e.empno, e.ename, d.dname
-> from emp e
-> join dept d
-> on e.deptno = d.deptno;
+-------+--------+------------+
| empno | ename | dname |
+-------+--------+------------+
| 7782 | CLARK | ACCOUNTING |
| 7839 | KING | ACCOUNTING |
| 7934 | MILLER | ACCOUNTING |
| 7369 | SMITH | RESEARCH |
| 7566 | JONES | RESEARCH |
| 7788 | SCOTT | RESEARCH |
| 7876 | ADAMS | RESEARCH |
| 7902 | FORD | RESEARCH |
| 7499 | ALLEN | SALES |
| 7521 | WARD | SALES |
| 7654 | MARTIN | SALES |
| 7698 | BLAKE | SALES |
| 7844 | TURNER | SALES |
| 7900 | JAMES | SALES |
+-------+--------+------------+
14 rows in set (0.00 sec)
步骤二:筛选
select e.empno, e.ename, d.dname
from emp e
join dept d
on e.deptno = d.deptno
join emp e2
on e.mgr = e2.empno
where e.hiredate<e2.hiredate; //where得放后面
16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
select d.dname, e.*
from emp e
right join dept d
on e.deptno=d.deptno;
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| dname | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| ACCOUNTING | 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| ACCOUNTING | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| ACCOUNTING | 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| RESEARCH | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| RESEARCH | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| RESEARCH | 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| RESEARCH | 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| RESEARCH | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| SALES | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| SALES | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| SALES | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| SALES | 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| SALES | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| SALES | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| OPERATIONS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
15 rows in set (0.00 sec)
17、列出至少有 5 个员工的所有部门
步骤一:统计每个部门的人数
mysql> select d.dname, count(*)
-> from emp e
-> join dept d
-> on e.deptno = d.deptno
-> group by e.deptno;
+------------+----------+
| dname | count(*) |
+------------+----------+
| ACCOUNTING | 3 |
| RESEARCH | 5 |
| SALES | 6 |
+------------+----------+
3 rows in set (0.00 sec)
步骤二:筛选
select d.dname, count(*)
from emp e
join dept d
on e.deptno = d.deptno
group by e.deptno
having count(*)>=5; //多这句
+----------+----------+
| dname | count(*) |
+----------+----------+
| RESEARCH | 5 |
| SALES | 6 |
+----------+----------+
2 rows in set (0.00 sec)
18、列出薪金比"SMITH"多的所有员工信息
步骤一:找到SMITH的薪资
mysql> select sal from emp where ename='SMITH';
+--------+
| sal |
+--------+
| 800.00 |
+--------+
1 row in set (0.00 sec)
步骤二:筛选
select e.*
from emp e
join (select sal from emp where ename='SMITH') t
where e.sal>t.sal;
或者
select *
from emp
where sal>(select sal from emp where ename='SMITH');
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
13 rows in set (0.00 sec)
19、列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数.
步骤一:找到所有办事员的姓名
mysql> select deptno, ename from emp where job='CLERK';
+--------+--------+
| deptno | ename |
+--------+--------+
| 20 | SMITH |
| 20 | ADAMS |
| 30 | JAMES |
| 10 | MILLER |
+--------+--------+
4 rows in set (0.00 sec)
步骤二:找到每个部门的人数
mysql> select d.deptno, d.dname, count(*) as cc
-> from emp e
-> join dept d
-> where e.deptno = d.deptno
-> group by e.deptno;
+--------+------------+----+
| deptno | dname | cc |
+--------+------------+----+
| 10 | ACCOUNTING | 3 |
| 20 | RESEARCH | 5 |
| 30 | SALES | 6 |
+--------+------------+----+
3 rows in set (0.00 sec)
步骤三:连接两张表
select t1.ename, t2.dname, t2.cc
from (select deptno, ename from emp where job='CLERK') t1
join (select d.deptno, d.dname, count(*) as cc from emp e join dept d where e.deptno = d.deptno group by e.deptno) t2
on t1.deptno=t2.deptno;
+--------+------------+----+
| ename | dname | cc |
+--------+------------+----+
| SMITH | RESEARCH | 5 |
| ADAMS | RESEARCH | 5 |
| JAMES | SALES | 6 |
| MILLER | ACCOUNTING | 3 |
+--------+------------+----+
4 rows in set (0.00 sec)
20、列出最低薪金大于 1500 的各种工作及从事此工作的全部雇员人数.
步骤一:查询每种工作的最低薪资
mysql> select job, min(sal) min_sal from emp group by job;
+-----------+---------+
| job | min_sal |
+-----------+---------+
| ANALYST | 3000.00 |
| CLERK | 800.00 |
| MANAGER | 2450.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1250.00 |
+-----------+---------+
5 rows in set (0.00 sec)
步骤二:查询最低薪资大于1500的工作
mysql> select job, min(sal) min_sal from emp group by job having min(sal)>1500;
+-----------+---------+
| job | min_sal |
+-----------+---------+
| ANALYST | 3000.00 |
| MANAGER | 2450.00 |
| PRESIDENT | 5000.00 |
+-----------+---------+
3 rows in set (0.00 sec)
步骤三:统计各种工作人数
select job,count(*) from emp group by job;
+-----------+----------+
| job | count(*) |
+-----------+----------+
| ANALYST | 2 |
| CLERK | 4 |
| MANAGER | 3 |
| PRESIDENT | 1 |
| SALESMAN | 4 |
+-----------+----------+
5 rows in set (0.00 sec)
步骤四:合起来
select t1.job,t2.num
from (select job, min(sal) min_sal from emp group by job having min(sal)>1500) t1
join (select job,count(*) num from emp group by job) t2
on t1.job=t2.job;
+-----------+-----+
| job | num |
+-----------+-----+
| ANALYST | 2 |
| MANAGER | 3 |
| PRESIDENT | 1 |
+-----------+-----+
3 rows in set (0.00 sec)
步骤三和步骤四可以合起来用以下代替:
mysql> select job, count(*) from emp group by job having min(sal)>1500;
+-----------+----------+
| job | count(*) |
+-----------+----------+
| ANALYST | 2 |
| MANAGER | 3 |
| PRESIDENT | 1 |
+-----------+----------+
3 rows in set (0.00 sec)
21、列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部 门编号
步骤一:先查找到编号
mysql> select deptno from dept where dname='SALES';
+--------+
| deptno |
+--------+
| 30 |
+--------+
1 row in set (0.00 sec)
步骤二:
mysql> select ename from emp where deptno=(select deptno from dept where dname='SALES');
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| BLAKE |
| TURNER |
| JAMES |
+--------+
6 rows in set (0.00 sec)
22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.
步骤一:求出平均薪资
select avg(sal) avg_sal from emp;
+-------------+
| avg_sal |
+-------------+
| 2073.214286 |
+-------------+
1 row in set (0.00 sec)
步骤二:找出薪资高于平均薪资的人
select ename, deptno, mgr, sal from emp where sal>(select avg(sal) avg_sal from emp);
+-------+--------+------+---------+
| ename | deptno | mgr | sal |
+-------+--------+------+---------+
| JONES | 20 | 7839 | 2975.00 |
| BLAKE | 30 | 7839 | 2850.00 |
| CLARK | 10 | 7839 | 2450.00 |
| SCOTT | 20 | 7566 | 3000.00 |
| KING | 10 | NULL | 5000.00 |
| FORD | 20 | 7566 | 3000.00 |
+-------+--------+------+---------+
6 rows in set (0.00 sec)
步骤三:加入部门名称
select t1.ename '姓名', d.dname '部门'
from (select ename, deptno, mgr, sal from emp where sal>(select avg(sal) avg_sal from emp)) t1
join dept d
on t1.deptno = d.deptno;
+-------+------------+
| 姓名 | 部门 |
+-------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| FORD | RESEARCH |
| BLAKE | SALES |
+-------+------------+
6 rows in set (0.00 sec)
步骤四:加入上级领导
select t1.ename '姓名', d.dname '部门', e.ename '上级领导'
from (select ename, deptno, mgr, sal from emp where sal>(select avg(sal) avg_sal from emp)) t1
join dept d
on t1.deptno = d.deptno
left join emp e
on t1.mgr = e.empno;
步骤五:加入薪资等级
select t1.ename '姓名', d.dname '部门', e.ename '上级领导', s.grade '工资等级'
from (select ename, deptno, mgr, sal from emp where sal>(select avg(sal) avg_sal from emp)) t1
join dept d
on t1.deptno = d.deptno
left join emp e
on t1.mgr = e.empno
join salgrade s
on t1.sal between s.losal and s.hisal;
+-------+------------+----------+----------+
| 姓名 | 部门 | 上级领导 | 工资等级 |
+-------+------------+----------+----------+
| JONES | RESEARCH | KING | 4 |
| BLAKE | SALES | KING | 4 |
| CLARK | ACCOUNTING | KING | 4 |
| SCOTT | RESEARCH | JONES | 4 |
| KING | ACCOUNTING | NULL | 5 |
| FORD | RESEARCH | JONES | 4 |
+-------+------------+----------+----------+
6 rows in set (0.00 sec)
23、列出与"SCOTT"从事相同工作的所有员工及部门名称
步骤一:找到此人从事的工作
mysql> select job from emp where ename='SCOTT';
+---------+
| job |
+---------+
| ANALYST |
+---------+
1 row in set (0.00 sec)
步骤二:找到相同工作的人
mysql> select * from emp where job=(select job from emp where ename='SCOTT') and ename!='SCOTT';
+-------+-------+---------+------+------------+---------+------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+-------+---------+------+------------+---------+------+--------+
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
+-------+-------+---------+------+------------+---------+------+--------+
1 row in set (0.00 sec)
步骤三:找到部门
select t.ename, d.dname
from (select * from emp where job=(select job from emp where ename='SCOTT') and ename!='SCOTT') t
join dept d
on d.deptno = t.deptno;
+-------+----------+
| ename | dname |
+-------+----------+
| FORD | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)
24、列出薪金等于部门 30 中员工的薪金的其他员工的姓名和薪金.
步骤一:找到部门30的所有薪资
mysql> select sal from emp where deptno=30;
+---------+
| sal |
+---------+
| 1600.00 |
| 1250.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
| 950.00 |
+---------+
6 rows in set (0.00 sec)
步骤二:找到所有员工薪资等同于部门30的薪资的员工
select ename, sal, deptno from emp where (sal in (select sal from emp where deptno=30));
+--------+---------+--------+
| ename | sal | deptno |
+--------+---------+--------+
| ALLEN | 1600.00 | 30 |
| WARD | 1250.00 | 30 |
| MARTIN | 1250.00 | 30 |
| BLAKE | 2850.00 | 30 |
| TURNER | 1500.00 | 30 |
| JAMES | 950.00 | 30 |
+--------+---------+--------+
6 rows in set (0.00 sec)
步骤三:过滤掉30部门的员工
select ename, sal, deptno from emp where (sal in (select sal from emp where deptno=30) and deptno!=30);
符合条件的为0
25、列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金.部门名称.
步骤一:找到部门30的最高薪资
mysql> select max(sal) from emp where deptno=30;
+----------+
| max(sal) |
+----------+
| 2850.00 |
+----------+
1 row in set (0.00 sec)
步骤二:找到所有高于部门30最高薪资的人
select ename,sal,deptno from emp where sal > (select max(sal) from emp where deptno=30);
+-------+---------+--------+
| ename | sal | deptno |
+-------+---------+--------+
| JONES | 2975.00 | 20 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| FORD | 3000.00 | 20 |
+-------+---------+--------+
4 rows in set (0.00 sec)
步骤三:部门加进去
select t.ename, t.sal, d.dname
from (select ename,sal,deptno from emp where sal > (select max(sal) from emp where deptno=30)) t
join dept d
on t.deptno = d.deptno;
+-------+---------+------------+
| ename | sal | dname |
+-------+---------+------------+
| KING | 5000.00 | ACCOUNTING |
| JONES | 2975.00 | RESEARCH |
| SCOTT | 3000.00 | RESEARCH |
| FORD | 3000.00 | RESEARCH |
+-------+---------+------------+
4 rows in set (0.00 sec)
答案二:
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.dname
from emp e
join dept d
on d.deptno=e.deptno;
步骤二:统计每个部门的人数
select d.dname, count(e.ename)
from emp e
right join dept d
on d.deptno=e.deptno
group by e.deptno;
+------------+----------------+
| dname | count(e.ename) |
+------------+----------------+
| OPERATIONS | 0 |
| ACCOUNTING | 3 |
| RESEARCH | 5 |
| SALES | 6 |
+------------+----------------+
4 rows in set (0.00 sec)
步骤三:加入平均薪资
select d.dname, count(e.ename), ifnull(round(avg(e.sal), 2), 0)
from emp e
right join dept d
on d.deptno=e.deptno
group by e.deptno;
+------------+----------------+---------------------------------+
| dname | count(e.ename) | ifnull(round(avg(e.sal), 2), 0) |
+------------+----------------+---------------------------------+
| OPERATIONS | 0 | 0.00 |
| ACCOUNTING | 3 | 2916.67 |
| RESEARCH | 5 | 2175.00 |
| SALES | 6 | 1566.67 |
+------------+----------------+---------------------------------+
4 rows in set (0.00 sec)
步骤四:加入平均服务期限
select d.dname, count(e.ename),
ifnull(round(avg(e.sal), 2), 0) avg_sal, ifnull(avg(timestampdiff(YEAR, e.hiredate, now())),0) avg_year
from emp e
right join dept d
on d.deptno=e.deptno
group by e.deptno;
27、列出所有员工的姓名、部门名称和工资
select e.ename, d.dname, e.sal
from emp e
join dept d
on e.deptno=d.deptno;
+--------+------------+---------+
| ename | dname | sal |
+--------+------------+---------+
| CLARK | ACCOUNTING | 2450.00 |
| KING | ACCOUNTING | 5000.00 |
| MILLER | ACCOUNTING | 1300.00 |
| SMITH | RESEARCH | 800.00 |
| JONES | RESEARCH | 2975.00 |
| SCOTT | RESEARCH | 3000.00 |
| ADAMS | RESEARCH | 1100.00 |
| FORD | RESEARCH | 3000.00 |
| ALLEN | SALES | 1600.00 |
| WARD | SALES | 1250.00 |
| MARTIN | SALES | 1250.00 |
| BLAKE | SALES | 2850.00 |
| TURNER | SALES | 1500.00 |
| JAMES | SALES | 950.00 |
+--------+------------+---------+
14 rows in set (0.00 sec)
28、列出所有部门的详细信息和人数
步骤一:统计每个部门的人数
mysql> select deptno, count(*) num from emp group by deptno;
+--------+-----+
| deptno | num |
+--------+-----+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+-----+
3 rows in set (0.00 sec)
步骤二:
select d.*, ifnull(t.num,0)
from dept d
left join (select deptno, count(*) num from emp group by deptno) t
on d.deptno=t.deptno;
+--------+------------+----------+-----------------+
| DEPTNO | DNAME | LOC | ifnull(t.num,0) |
+--------+------------+----------+-----------------+
| 10 | ACCOUNTING | NEW YORK | 3 |
| 20 | RESEARCH | DALLAS | 5 |
| 30 | SALES | CHICAGO | 6 |
| 40 | OPERATIONS | BOSTON | 0 |
+--------+------------+----------+-----------------+
4 rows in set (0.00 sec)
29、列出各种工作的最低工资及从事此工作的雇员姓名
步骤一:找出各种工作的最低薪资
select job,min(sal) from emp group by job;
+-----------+----------+
| job | min(sal) |
+-----------+----------+
| ANALYST | 3000.00 |
| CLERK | 800.00 |
| MANAGER | 2450.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1250.00 |
+-----------+----------+
5 rows in set (0.00 sec)
步骤二
select e.ename, t.*
from emp e
join (select job,min(sal) min_sal from emp group by job) t
on e.job=t.job and e.sal=t.min_sal;
+--------+-----------+---------+
| ename | job | min_sal |
+--------+-----------+---------+
| SMITH | CLERK | 800.00 |
| WARD | SALESMAN | 1250.00 |
| MARTIN | SALESMAN | 1250.00 |
| CLARK | MANAGER | 2450.00 |
| SCOTT | ANALYST | 3000.00 |
| KING | PRESIDENT | 5000.00 |
| FORD | ANALYST | 3000.00 |
+--------+-----------+---------+
7 rows in set (0.00 sec)
30、列出各个部门的 MANAGER(领导)的最低薪金
步骤一:找出工作为MANAGER的所有人
mysql> select deptno,ename,sal from emp where job='MANAGER';
+--------+-------+---------+
| deptno | ename | sal |
+--------+-------+---------+
| 20 | JONES | 2975.00 |
| 30 | BLAKE | 2850.00 |
| 10 | CLARK | 2450.00 |
+--------+-------+---------+
3 rows in set (0.00 sec)
步骤二
select deptno,min(sal) from emp where job='MANAGER' group by deptno;
+--------+----------+
| deptno | min(sal) |
+--------+----------+
| 10 | 2450.00 |
| 20 | 2975.00 |
| 30 | 2850.00 |
+--------+----------+
3 rows in set (0.00 sec)
31、列出所有员工的年工资,按年薪从低到高排序
select ename, (sal + ifnull(comm,0))*12 as income from emp order by income;
+--------+----------+
| ename | income |
+--------+----------+
| SMITH | 9600.00 |
| JAMES | 11400.00 |
| ADAMS | 13200.00 |
| MILLER | 15600.00 |
| TURNER | 18000.00 |
| WARD | 21000.00 |
| ALLEN | 22800.00 |
| CLARK | 29400.00 |
| MARTIN | 31800.00 |
| BLAKE | 34200.00 |
| JONES | 35700.00 |
| FORD | 36000.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
+--------+----------+
14 rows in set (0.00 sec)
32、求出员工领导的薪水超过 3000 的员工名称与领导名称
步骤一:找出员工领导对应表
mysql> select a.ename, b.ename, b.sal
-> from emp a
-> join emp b
-> on a.mgr = b.empno;
+--------+-------+---------+
| ename | ename | sal |
+--------+-------+---------+
| SMITH | FORD | 3000.00 |
| ALLEN | BLAKE | 2850.00 |
| WARD | BLAKE | 2850.00 |
| JONES | KING | 5000.00 |
| MARTIN | BLAKE | 2850.00 |
| BLAKE | KING | 5000.00 |
| CLARK | KING | 5000.00 |
| SCOTT | JONES | 2975.00 |
| TURNER | BLAKE | 2850.00 |
| ADAMS | SCOTT | 3000.00 |
| JAMES | BLAKE | 2850.00 |
| FORD | JONES | 2975.00 |
| MILLER | CLARK | 2450.00 |
+--------+-------+---------+
13 rows in set (0.00 sec)
步骤二:筛选>3000
select a.ename, b.ename, b.sal
from emp a
join emp b
on a.mgr = b.empno
where b.sal>3000; //加筛选
+-------+-------+---------+
| ename | ename | sal |
+-------+-------+---------+
| JONES | KING | 5000.00 |
| BLAKE | KING | 5000.00 |
| CLARK | KING | 5000.00 |
+-------+-------+---------+
3 rows in set (0.00 sec)
33、求出部门名称中,带’S’字符的部门员工的工资合计、部门人数
步骤一:找到员工名和部门对照表
select d.dname, e.ename
from emp e
join dept d
on e.deptno=d.deptno;
+------------+--------+
| dname | ename |
+------------+--------+
| ACCOUNTING | CLARK |
| ACCOUNTING | KING |
| ACCOUNTING | MILLER |
| RESEARCH | SMITH |
| RESEARCH | JONES |
| RESEARCH | SCOTT |
| RESEARCH | ADAMS |
| RESEARCH | FORD |
| SALES | ALLEN |
| SALES | WARD |
| SALES | MARTIN |
| SALES | BLAKE |
| SALES | TURNER |
| SALES | JAMES |
+------------+--------+
14 rows in set (0.00 sec)
步骤二:按照部门分组,统计每组人数
select d.dname, count(e.ename)
from emp e
join dept d
on e.deptno=d.deptno
group by d.deptno;
+------------+----------------+
| dname | count(e.ename) |
+------------+----------------+
| ACCOUNTING | 3 |
| RESEARCH | 5 |
| SALES | 6 |
+------------+----------------+
3 rows in set (0.00 sec)
步骤三:加入名字条件
select d.dname, count(e.ename)
from emp e
right join dept d
on e.deptno=d.deptno
where d.dname like '%S%'
group by d.deptno;
+------------+----------------+
| dname | count(e.ename) |
+------------+----------------+
| RESEARCH | 5 |
| SALES | 6 |
| OPERATIONS | 0 |
+------------+----------------+
3 rows in set (0.00 sec)
步骤四:加入平均薪资
select d.dname, ifnull(sum(e.sal), 0) as sumsal, count(e.ename)
from emp e
right join dept d
on e.deptno = d.deptno
where d.dname like '%S%'
group by d.deptno;
+------------+----------+----------------+
| dname | sumsal | count(e.ename) |
+------------+----------+----------------+
| RESEARCH | 10875.00 | 5 |
| SALES | 9400.00 | 6 |
| OPERATIONS | 0.00 | 0 |
+------------+----------+----------------+
3 rows in set (0.00 sec)
34、给任职日期超过 30 年的员工加薪 10%
update emp
set sal =sal*1.1
where timestampdiff(YEAR, hiredate, now())>30;
Query OK, 14 rows affected (0.00 sec)
Rows matched: 14 Changed: 14 Warnings: 0