【B站老杜】习题详解

文章目录

【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zdb呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值