干货:34道MySQL经典面试题

讲义和SQL脚本地址:https://github.com/dgfwork/MySQL_Notebook

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

 1 select
 2         e.deptno,max(e.sal) as maxsal
 3 from
 4         emp  e
 5 group by
 6             e.deptno
 7             
 8             
 9 -- mysql> select
10 --     -> e.deptno,max(e.sal)
11 --     -> from
12 --     -> emp  e
13 --     -> group by
14 --     -> e.deptno;
15 -- +--------+------------+
16 -- | deptno | max(e.sal) |
17 -- +--------+------------+
18 -- |     10 |    5000.00 |
19 -- |     20 |    3000.00 |
20 -- |     30 |    2850.00 |
21 -- +--------+------------+
22 
23 -- # 将以上查询结果当做一个临时表t(deptno,maxsal)
24 select 
25         e.deptno,
26         e.ename,
27         t.maxsal,
28         e.sal
29 from 
30         (select
31                 e.deptno,max(e.sal) as maxsal
32         from
33                 emp  e
34 group by
35             e.deptno) t
36         
37 join 
38         emp e 
39 on 
40         e.deptno=t.deptno
41 where 
42         t.maxsal=e.sal
43 
44 -- mysql> select
45 --     -> e.deptno,
46 --     -> e.ename,
47 --     -> t.maxsal,
48 --     -> e.sal
49 --     -> from
50 --     -> (select
51 --     -> e.deptno,max(e.sal) as maxsal
52 --     -> from
53 --     -> emp  e
54 --     -> group by
55 --     -> e.deptno) t
56 --     -> join
57 --     -> emp e
58 --     -> on
59 --     -> e.deptno=t.deptno
60 --     -> where
61 --     -> t.maxsal=e.sal;
62 -- +--------+-------+---------+---------+
63 -- | deptno | ename | maxsal  | sal     |
64 -- +--------+-------+---------+---------+
65 -- |     30 | BLAKE | 2850.00 | 2850.00 |
66 -- |     20 | SCOTT | 3000.00 | 3000.00 |
67 -- |     10 | KING  | 5000.00 | 5000.00 |
68 -- |     20 | FORD  | 3000.00 | 3000.00 |
69 -- +--------+-------+---------+---------+
View Code

 2.那些人的薪水在部门平均薪水之上

 1 -- 解析:先查出每个部门的平均薪水表,再将其当做临时表
 2         t(deptno,avgsal)
 3 select 
 4         deptno,
 5         avg(sal) as avgsal
 6 from 
 7         emp  e
 8 group by 
 9         deptno
10         
11 -- mysql> select
12 --     -> deptno,
13 --     -> avg(sal) as avgsal
14 --     -> from
15 --     -> emp  e
16 --     -> group by
17 --     -> deptno;
18 -- +--------+-------------+
19 -- | deptno | avgsal      |
20 -- +--------+-------------+
21 -- |     10 | 3150.000000 |
22 -- |     20 | 2220.833333 |
23 -- |     30 | 1566.666667 |
24 -- +--------+-------------+
25         
26         
27 select
28             e.deptno,
29             e.ename,
30             e.sal
31 from 
32             (select 
33                 deptno,
34                 avg(sal) as avgsal
35             from 
36                     emp  e
37             group by 
38                     deptno) t
39 join 
40         emp  e
41 on 
42         t.deptno=e.deptno
43 where   
44         e.sal>t.avgsal;
45         
46 -- mysql> select
47 --     -> e.deptno,
48 --     -> e.ename,
49 --     -> e.sal
50 --     -> from
51 --     -> (select
52 --     -> deptno,
53 --     -> avg(sal) as avgsal
54 --     -> from
55 --     -> emp  e
56 --     -> group by
57 --     -> deptno) t
58 --     -> join
59 --     -> emp  e
60 --     -> on
61 --     -> t.deptno=e.deptno
62 --     -> where
63 --     -> e.sal>t.avgsal;
64 -- +--------+-------+---------+
65 -- | deptno | ename | sal     |
66 -- +--------+-------+---------+
67 -- |     30 | ALLEN | 1600.00 |
68 -- |     20 | JONES | 2975.00 |
69 -- |     30 | BLAKE | 2850.00 |
70 -- |     20 | CLARK | 2450.00 |
71 -- |     20 | SCOTT | 3000.00 |
72 -- |     10 | KING  | 5000.00 |
73 -- |     20 | FORD  | 3000.00 |
74 -- +--------+-------+---------+
View Code

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

  1 -- 3.1平均薪水的等级
  2 -- 第一步:先找平均薪水,生成一张临时表
  3 --     t(deptno,avgsal)
  4 
  5 select 
  6         deptno,
  7         avg(sal) as avgsal
  8 from 
  9         emp  e
 10 group by 
 11         deptno
 12 -- 第二步:根据上面的结果和薪水等级表连接
 13 select
 14         t.deptno,
 15         s.grade
 16 from 
 17         (select 
 18             deptno,
 19             avg(sal) as avgsal
 20         from 
 21                 emp  e
 22         group by 
 23                 deptno) t
 24 join
 25         salgrade s
 26 on 
 27         t.avgsal between s.losal and s.hisal
 28 order by deptno;
 29 
 30 -- 结果如下:
 31 -- mysql> select
 32 --     -> t.deptno,
 33 --     -> s.grade
 34 --     -> from
 35 --     -> (select
 36 --     -> deptno,
 37 --     -> avg(sal) as avgsal
 38 --     -> from
 39 --     -> emp  e
 40 --     -> group by
 41 --     -> deptno) t
 42 --     -> join
 43 --     -> salgrade s
 44 --     -> on
 45 --     -> t.avgsal between s.losal and s.hisal
 46 --     -> ;
 47 -- +--------+-------+
 48 -- | deptno | grade |
 49 -- +--------+-------+
 50 -- |     30 |     3 |
 51 -- |     20 |     4 |
 52 -- |     10 |     5 |
 53 -- +--------+-------+
 54 
 55 
 56 
 57 -- 3.2每个部门所有人平均的薪水等级
 58     select 
 59             e.ename,
 60             e.sal,
 61             s.grade
 62     from
 63             emp  e
 64     join 
 65             salgrade s 
 66     on 
 67             e.sal between s.losal and s.hisal;
 68     
 69     
 70     select 
 71             t.deptno,
 72             avg(grade) as avg_grade
 73     from 
 74             (select 
 75                     e.deptno,
 76                     e.ename,
 77                     e.sal,
 78                     s.grade
 79             from
 80                     emp  e
 81             join 
 82                     salgrade s 
 83             on 
 84                     e.sal between s.losal and s.hisal) t
 85     group by 
 86             t.deptno;
 87 -- 结果如下:               
 88 -- mysql> select
 89 --     -> t.deptno,
 90 --     -> avg(grade) as avg_grade
 91 --     -> from
 92 --     -> (select
 93 --     -> e.deptno,
 94 --     -> e.ename,
 95 --     -> e.sal,
 96 --     -> s.grade
 97 --     -> from
 98 --     -> emp  e
 99 --     -> join
100 --     -> salgrade s
101 --     -> on
102 --     -> e.sal between s.losal and s.hisal) t
103 --     -> group by
104 --     -> t.deptno;
105 -- +--------+-----------+
106 -- | deptno | avg_grade |
107 -- +--------+-----------+
108 -- |     10 |    3.5000 |
109 -- |     20 |    3.0000 |
110 -- |     30 |    2.5000 |
111 -- +--------+-----------+
View Code

4.不准用聚合函数(max),取得最高薪水(给出两种方法)

 1 -- 方法一:
 2 select sal from emp order by sal desc limit 1;
 3 -- +---------+
 4 -- | sal     |
 5 -- +---------+
 6 -- | 5000.00 |
 7 -- +---------+
 8 
 9 -- 方法二:
10 select  
11         distinct
12         a.sal 
13 from        
14             emp  a
15 join        
16             emp  b 
17 on 
18             a.sal > b.sal 
19 
20             
21 select 
22             e.ename,
23             e.sal
24 from        
25             emp  e 
26 where 
27             e.sal not in (select    
28                                 distinct
29                                 a.sal 
30                                 from        
31                                             emp  a
32                                 join        
33                                             emp  b 
34                                 on 
35                                             a.sal < b.sal);
View Code

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

 1 -- 第一步:求出各部门的平均薪水,当做临时表
 2 select
 3             e.deptno,avg(e.sal) as avg_sal
 4 from 
 5             emp e
 6 group by 
 7             e.deptno
 8 -- 第二步:求出最大值
 9 select
10         max(avg_sal) as max_avg_sal
11 from    
12         (select
13             e.deptno,avg(e.sal) as avg_sal
14         from 
15                     emp e
16         group by 
17                     e.deptno) a;
18 -- 第三步:没一组的平均薪水和最大值进行比较,如果相等则取出来
19 -- # 这样可以取出多个平均值一样的部门,避免遗漏的情况。                         
20 select
21             e.deptno,avg(e.sal) as avg_sal
22 from 
23             emp e
24 
25 group by 
26             e.deptno
27 having  
28         avg_sal=(select
29                             max(avg_sal) as max_avg_sal
30                     from    
31                             (select
32                                 e.deptno,avg(e.sal) as avg_sal
33                             from 
34                                         emp e
35                             group by 
36                                         e.deptno) a);
37 -- +--------+-------------+
38 -- | deptno | avg_sal     |
39 -- +--------+-------------+
40 -- |     10 | 3150.000000 |
41 -- +--------+-------------+
View Code

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

 1 -- # 思路和上面的一样,再和部门表做个表连接即可。
 2 select
 3             d.dname,avg(e.sal) as avg_sal
 4 from 
 5             emp e
 6 join        
 7             dept d 
 8 on          
 9             e.deptno=d.deptno
10 group by 
11             e.deptno
12 having  
13         avg_sal=(select
14                             max(avg_sal) as max_avg_sal
15                     from    
16                             (select
17                                 e.deptno,avg(e.sal) as avg_sal
18                             from 
19                                         emp e
20                             group by 
21                                         e.deptno) a);
22 -- +------------+-------------+
23 -- | dname      | avg_sal     |
24 -- +------------+-------------+
25 -- | ACCOUNTING | 3150.000000 |
26 -- +------------+-------------+
View Code

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

  1 -- # 和上面的思路大致相同,找到最低的数值再和下面的数据进行比较
  2 -- # 第一步:先求出每个部门的平均薪水以及等级
  3 select 
  4             e.deptno,
  5             avg(e.sal) as avg_sal
  6 from 
  7             emp   e 
  8 group by 
  9             e.deptno;
 10 -- +--------+-------------+
 11 -- | deptno | avg_sal     |
 12 -- +--------+-------------+
 13 -- |     10 | 3150.000000 |
 14 -- |     20 | 2220.833333 |
 15 -- |     30 | 1566.666667 |
 16 -- +--------+-------------+
 17 
 18 -- 将上表当做临时表
 19 --     t(deptno,avg_sal)
 20 
 21 
 22 -- # 第二步:查出每个平均薪水的等级,需要和salgrade做连接
 23 select 
 24         t.deptno,
 25         t.avg_sal,
 26         s.grade
 27 from 
 28         (
 29         select 
 30                     e.deptno,
 31                     avg(e.sal) as avg_sal
 32         from 
 33                     emp   e 
 34         group by 
 35                     e.deptno
 36         ) t
 37 join 
 38         salgrade  s
 39 on 
 40         t.avg_sal between s.losal and s.hisal;
 41         
 42 -- +--------+-------------+-------+
 43 -- | deptno | avg_sal     | grade |
 44 -- +--------+-------------+-------+
 45 -- |     30 | 1566.666667 |     3 |
 46 -- |     20 | 2220.833333 |     4 |
 47 -- |     10 | 3150.000000 |     5 |
 48 -- +--------+-------------+-------+
 49 
 50 -- 第三步:
 51 --         找出上面的最小值
 52 
 53 select 
 54         min(grade) as min_grade
 55 from 
 56         (
 57         select 
 58         t.deptno,
 59         t.avg_sal,
 60         s.grade
 61 from 
 62         (
 63         select 
 64                     e.deptno,
 65                     avg(e.sal) as avg_sal
 66         from 
 67                     emp   e 
 68         group by 
 69                             e.deptno
 70                 ) t
 71         join 
 72                 salgrade  s
 73         on 
 74                 t.avg_sal between s.losal and s.hisal
 75         ) t;
 76 
 77 -- 结果如下:
 78         
 79 select 
 80         t.deptno,
 81         d.dname,
 82         t.avg_sal,
 83         s.grade
 84 from 
 85         (
 86         select 
 87                     e.deptno,
 88                     avg(e.sal) as avg_sal
 89         from 
 90                     emp   e 
 91         group by 
 92                     e.deptno
 93         ) t
 94 join 
 95         salgrade  s
 96 on 
 97         t.avg_sal between s.losal and s.hisal
 98 join 
 99             dept d 
100 on 
101             d.deptno=t.deptno
102 having s.grade=(
103     select 
104         min(grade) as min_grade
105     from 
106         (
107             select 
108             t.deptno,
109             t.avg_sal,
110             s.grade
111             from 
112                         (
113                         select 
114                                     e.deptno,
115                                     avg(e.sal) as avg_sal
116                         from 
117                                     emp   e 
118                         group by 
119                                             e.deptno
120                                 ) t
121             join 
122                     salgrade  s
123             on 
124                     t.avg_sal between s.losal and s.hisal
125             ) t
126 );
127 -- +--------+-------+-------------+-------+
128 -- | deptno | dname | avg_sal     | grade |
129 -- +--------+-------+-------------+-------+
130 -- |     30 | SALES | 1566.666667 |     3 |
131 -- +--------+-------+-------------+-------+
132 -- # 总体思路就是,我先找出等级最小的,再将最小值去和每一个比较,
133 -- 值相同的就查出部门名称。
View Code

8.取得比普通员工(员工代码没有在mgr上出现的)的 最高薪水还要高的经理人姓名

 1 -- 知识点:
 2 --             not in 不会自动忽略空值
 3 --             in会自动忽略空值
 4 --     第一步:先找出mgr
 5         select distinct mgr  from emp;
 6     -- 第二步找出普通员工的ID:
 7         select empno,sal from emp where empno not in (select distinct mgr  from emp where mgr is not null);
 8         -- +-------+---------+
 9         -- | empno | sal     |
10         -- +-------+---------+
11         -- |  7396 |  800.00 |
12         -- |  7499 | 1600.00 |
13         -- |  7521 | 1250.00 |
14         -- |  7654 | 1250.00 |
15         -- |  7844 | 1500.00 |
16         -- |  7876 | 1100.00 |
17         -- |  7900 |  950.00 |
18         -- |  7934 | 1300.00 |
19         -- +-------+---------+
20     select 
21             max(t.sal) as max_sal
22     from 
23         (select empno,sal from emp where empno not in 
24             (select distinct mgr  from emp where mgr is not null)) t;
25 
26     select 
27             ename,sal 
28     from 
29         emp 
30     where 
31             emp.sal > (
32                 select 
33             max(t.sal) as max_sal
34             from 
35                 (select empno,sal from emp where empno not in 
36                     (select distinct mgr  from emp where mgr is not null)) t);
37 -- mysql> select
38 -- -> ename,sal
39 -- -> from
40 -- -> emp
41 -- -> where
42 -- -> emp.sal > (
43 -- -> select
44 -- -> max(t.sal) as max_sal
45 -- -> from
46 -- -> (select empno,sal from emp where empno not in
47 -- -> (select distinct mgr  from emp where mgr is not null)) t);
48 -- +-------+---------+
49 -- | ename | sal     |
50 -- +-------+---------+
51 -- | JONES | 2975.00 |
52 -- | BLAKE | 2850.00 |
53 -- | CLARK | 2450.00 |
54 -- | SCOTT | 3000.00 |
55 -- | KING  | 5000.00 |
56 -- | FORD  | 3000.00 |
57 -- +-------+---------+
View Code

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

 1 select ename,sal from emp order by sal desc limit 0,5;
 2 -- +-------+---------+
 3 -- | ename | sal     |
 4 -- +-------+---------+
 5 -- | KING  | 5000.00 |
 6 -- | SCOTT | 3000.00 |
 7 -- | FORD  | 3000.00 |
 8 -- | JONES | 2975.00 |
 9 -- | BLAKE | 2850.00 |
10 -- +-------+---------+
View Code

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

 1 select ename,sal from emp order by sal desc limit 5,5;
 2 -- +--------+---------+
 3 -- | ename  | sal     |
 4 -- +--------+---------+
 5 -- | CLARK  | 2450.00 |
 6 -- | ALLEN  | 1600.00 |
 7 -- | TURNER | 1500.00 |
 8 -- | MILLER | 1300.00 |
 9 -- | MARTIN | 1250.00 |
10 -- +--------+---------+
View Code

11.取得最后入职的五名员工

 1 #按照入职时间来排序  入职晚 时间大 降序的话  排在前面 取前五个即可
 2 select ename,sal from emp order by hiredate desc limit 0,5;
 3 -- +--------+---------+------------+
 4 -- | ename  | sal     | hiredate   |
 5 -- +--------+---------+------------+
 6 -- | ADAMS  | 1100.00 | 1987-05-23 |
 7 -- | SCOTT  | 3000.00 | 1987-04-19 |
 8 -- | MILLER | 1300.00 | 1982-01-23 |
 9 -- | FORD   | 3000.00 | 1981-12-03 |
10 -- | JAMES  |  950.00 | 1981-12-03 |
11 -- +--------+---------+------------+
View Code

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

 1 -- # 先查出每个员工的薪水等级
 2 select
 3         e.ename,
 4         e.sal,
 5         s.grade
 6 from  
 7         emp  e 
 8 join 
 9         salgrade  s 
10 on 
11         e.sal between s.losal and s.hisal;
12 -- +--------+---------+-------+
13 -- | ename  | sal     | grade |
14 -- +--------+---------+-------+
15 -- | SMITH  |  800.00 |     1 |
16 -- | ALLEN  | 1600.00 |     3 |
17 -- | WARD   | 1250.00 |     2 |
18 -- | JONES  | 2975.00 |     4 |
19 -- | MARTIN | 1250.00 |     2 |
20 -- | BLAKE  | 2850.00 |     4 |
21 -- | CLARK  | 2450.00 |     4 |
22 -- | SCOTT  | 3000.00 |     4 |
23 -- | KING   | 5000.00 |     5 |
24 -- | TURNER | 1500.00 |     3 |
25 -- | ADAMS  | 1100.00 |     1 |
26 -- | JAMES  |  950.00 |     1 |
27 -- | FORD   | 3000.00 |     4 |
28 -- | MILLER | 1300.00 |     2 |
29 -- +--------+---------+-------+
30 
31 t(ename,sal,grade)
32 
33 -- # 再用聚合函数根据薪水等级分类即可
34 select 
35     t.grade ,
36     count(t.grade)  as grade_count
37 from 
38         (
39         select
40                 e.ename,
41                 e.sal,
42                 s.grade
43         from  
44                 emp  e 
45         join 
46                 salgrade  s 
47         on 
48                 e.sal between s.losal and s.hisal
49         ) t
50 group by 
51         grade;
52 -- +-------+-------------+
53 -- | grade | grade_count |
54 -- +-------+-------------+
55 -- |     1 |           3 |
56 -- |     2 |           3 |
57 -- |     3 |           2 |
58 -- |     4 |           5 |
59 -- |     5 |           1 |
60 -- +-------+-------------+
View Code

13.

14.列出所有员工及领导的名字

 1 select
 2             a.ename ,
 3             b.ename   as boss
 4 from 
 5             emp  a
 6 left join 
 7             emp b
 8 on 
 9             a.mgr=b.empno;
10 -- +--------+-------+
11 -- | ename  | boss  |
12 -- +--------+-------+
13 -- | SMITH  | FORD  |
14 -- | ALLEN  | BLAKE |
15 -- | WARD   | BLAKE |
16 -- | JONES  | KING  |
17 -- | MARTIN | BLAKE |
18 -- | BLAKE  | KING  |
19 -- | CLARK  | KING  |
20 -- | SCOTT  | JONES |
21 -- | KING   | NULL  |
22 -- | TURNER | BLAKE |
23 -- | ADAMS  | SCOTT |
24 -- | JAMES  | BLAKE |
25 -- | FORD   | JONES |
26 -- | MILLER | CLARK |
27 -- +--------+-------+
View Code

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

 1 select
 2             a.empno,
 3             a.ename ,
 4             d.dname
 5 
 6 from 
 7             emp  a
 8 left join 
 9             emp b
10 on 
11             a.mgr=b.empno
12 join 
13             dept  d 
14 on 
15             a.deptno=d.deptno
16 where 
17             a.hiredate<b.hiredate;
18 
19 -- +-------+-------+----------+
20 -- | empno | ename | dname    |
21 -- +-------+-------+----------+
22 -- |  7396 | SMITH | RESEARCH |
23 -- |  7566 | JONES | RESEARCH |
24 -- |  7782 | CLARK | RESEARCH |
25 -- |  7499 | ALLEN | SALES    |
26 -- |  7521 | WARD  | SALES    |
27 -- |  7698 | BLAKE | SALES    |
28 -- +-------+-------+----------+
View Code

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

 1 select 
 2         d.dname,
 3         e.*
 4 from 
 5         dept d
 6 left join 
 7         emp e 
 8 on 
 9         d.deptno=e.deptno
10 -- +------------+-------+--------+-----------+------+------------+---------+---------+--------+
11 -- | dname      | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
12 -- +------------+-------+--------+-----------+------+------------+---------+---------+--------+
13 -- | ACCOUNTING |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
14 -- | ACCOUNTING |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
15 -- | RESEARCH   |  7396 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
16 -- | RESEARCH   |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
17 -- | RESEARCH   |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     20 |
18 -- | RESEARCH   |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
19 -- | RESEARCH   |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
20 -- | RESEARCH   |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
21 -- | SALES      |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
22 -- | SALES      |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
23 -- | SALES      |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
24 -- | SALES      |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
25 -- | SALES      |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
26 -- | SALES      |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
27 -- | OPERATIONS |  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |
28 -- +------------+-------+--------+-----------+------+------------+---------+---------+--------+
View Code

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

 1 select
 2         e.deptno,
 3         d.dname,
 4         count(e.empno) as count_empno
 5 from 
 6         emp  e 
 7 join    
 8         dept  d 
 9 on 
10         e.deptno = d.deptno
11 group by 
12         e.deptno
13 having 
14         count_empno>5
15         
16 -- +--------+----------+-------------+
17 -- | deptno | dname    | count_empno |
18 -- +--------+----------+-------------+
19 -- |     20 | RESEARCH |           6 |
20 -- |     30 | SALES    |           6 |
21 -- +--------+----------+-------------+
View Code

18. 列出薪水比“SMITH”多的所有员工信息

 1 -- #第一步:先查出Smith的sal
 2 select * from emp where sal>(select sal from emp where ename ='smith');
 3 select sal from emp where ename ='smith';
 4 -- (主要考察子查询)
 5 
 6 -- +-------+--------+-----------+------+------------+---------+---------+--------+
 7 -- | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
 8 -- +-------+--------+-----------+------+------------+---------+---------+--------+
 9 -- |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
10 -- |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
11 -- |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
12 -- |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
13 -- |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
14 -- |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     20 |
15 -- |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
16 -- |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
17 -- |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
18 -- |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
19 -- |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
20 -- |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
21 -- |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
22 -- +-------+--------+-----------+------+------------+---------+---------+--------+
View Code

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

20.列出最低薪水大于1500的各种工作及从事此工作的全部雇员人数

 1 select 
 2         e.job ,
 3         min(e.sal) as minsal,
 4         count(e.empno) as countEmp
 5 from 
 6         emp  e
 7 group by 
 8             job 
 9 having
10             minsal>1500;
11 -- +-----------+---------+----------+
12 -- | job       | minsal  | countEmp |
13 -- +-----------+---------+----------+
14 -- | ANALYST   | 3000.00 |        2 |
15 -- | MANAGER   | 2450.00 |        3 |
16 -- | PRESIDENT | 5000.00 |        1 |
17 -- +-----------+---------+----------+
View Code

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

 1 select 
 2             e.ename
 3 from 
 4             emp  e 
 5 join 
 6             dept d 
 7 on          
 8             e.deptno=d.deptno
 9 where 
10             d.dname='sales';
11 -- +--------+
12 -- | ename  |
13 -- +--------+
14 -- | ALLEN  |
15 -- | WARD   |
16 -- | MARTIN |
17 -- | BLAKE  |
18 -- | TURNER |
19 -- | JAMES  |
20 -- +--------+
21 -- PS:还有一种办法就是先求出部门编号deptno
View Code

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

 1 -- # 第一步 先求公司平均薪水
 2 select 
 3         e.ename,e.sal,d.dname,b.ename as boss,s.grade
 4 from 
 5         emp e 
 6 join 
 7         dept  d 
 8 on 
 9         e.deptno = d.deptno
10 left join 
11         emp  b
12 on 
13         e.mgr=b.empno
14 join 
15         salgrade s 
16 on 
17         e.sal between s.losal and s.hisal
18 where 
19         e.sal >(select avg(sal) as avg_sal from emp);
20 -- +-------+---------+------------+-------+-------+
21 -- | ename | sal     | dname      | boss  | grade |
22 -- +-------+---------+------------+-------+-------+
23 -- | JONES | 2975.00 | RESEARCH   | KING  |     4 |
24 -- | BLAKE | 2850.00 | SALES      | KING  |     4 |
25 -- | CLARK | 2450.00 | RESEARCH   | KING  |     4 |
26 -- | SCOTT | 3000.00 | RESEARCH   | JONES |     4 |
27 -- | KING  | 5000.00 | ACCOUNTING | NULL  |     5 |
28 -- | FORD  | 3000.00 | RESEARCH   | JONES |     4 |
29 -- +-------+---------+------------+-------+-------+
View Code

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

 1 -- # 第一步:查出Scott的工作
 2 select
 3         job 
 4 from 
 5         emp 
 6 where 
 7         ename='scott';
 8 -- # 第二步查出部门
 9 select      
10             d.dname,
11             e.ename
12 from
13             emp e
14 join 
15             dept d 
16 on 
17             e.deptno=d.deptno
18 where 
19         job=(
20             select
21                     job 
22             from 
23                     emp 
24             where 
25                     ename='scott'
26         );
27 -- +----------+-------+
28 -- | dname    | ename |
29 -- +----------+-------+
30 -- | RESEARCH | SCOTT |
31 -- | RESEARCH | FORD  |
32 -- +----------+-------+
View Code

24.列出薪金等于部门30中员工的薪金的其它员工的姓名和薪金 

 1 select  sal  from emp where deptno=30;
 2 -- +---------+
 3 -- | sal     |
 4 -- +---------+
 5 -- | 1600.00 |
 6 -- | 1250.00 |
 7 -- | 1250.00 |
 8 -- | 2850.00 |
 9 -- | 1500.00 |
10 -- |  950.00 |
11 -- +---------+
12 
13 select ename ,sal from emp 
14 where sal in (select distinct sal  from emp where deptno=30)
15 and deptno<>30; 
16 -- Empty set
View Code

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

 1 -- # 第一步:先找出部门30的最高薪水
 2 select
 3         max(sal) as maxsal
 4 from 
 5         emp 
 6 where 
 7         deptno=30
 8 
 9 select 
10         e.ename,
11         e.sal,
12         d.dname
13 from 
14         emp e 
15 join 
16         dept d 
17 on 
18         e.deptno=d.deptno
19 where 
20         e.sal >(
21         select
22                 max(sal) as maxsal
23         from 
24                 emp 
25         where 
26                 deptno=30
27         );
28 -- +-------+---------+------------+
29 -- | ename | sal     | dname      |
30 -- +-------+---------+------------+
31 -- | KING  | 5000.00 | ACCOUNTING |
32 -- | JONES | 2975.00 | RESEARCH   |
33 -- | SCOTT | 3000.00 | RESEARCH   |
34 -- | FORD  | 3000.00 | RESEARCH   |
35 -- +-------+---------+------------+
View Code

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

1 -- 求平均服务期限  现在的时间减去入职时间 再 求平均值即可。
2 select avg((to_days(now())-to_days(hiredate))/365) as avgserveryear from emp;
3 -- +---------------+
4 -- | avgserveryear |
5 -- +---------------+
6 -- |   37.08180039 |
7 -- +---------------+
8 -- #再按照部门进行分类统计即可。
View Code

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

 1 select
 2         e.ename,
 3         d.dname,
 4         e.sal
 5 from 
 6             emp e 
 7 join 
 8             dept d 
 9 on 
10             e.deptno=d.deptno
11 -- +--------+------------+---------+
12 -- | ename  | dname      | sal     |
13 -- +--------+------------+---------+
14 -- | KING   | ACCOUNTING | 5000.00 |
15 -- | MILLER | ACCOUNTING | 1300.00 |
16 -- | SMITH  | RESEARCH   |  800.00 |
17 -- | JONES  | RESEARCH   | 2975.00 |
18 -- | CLARK  | RESEARCH   | 2450.00 |
19 -- | SCOTT  | RESEARCH   | 3000.00 |
20 -- | ADAMS  | RESEARCH   | 1100.00 |
21 -- | FORD   | RESEARCH   | 3000.00 |
22 -- | ALLEN  | SALES      | 1600.00 |
23 -- | WARD   | SALES      | 1250.00 |
24 -- | MARTIN | SALES      | 1250.00 |
25 -- | BLAKE  | SALES      | 2850.00 |
26 -- | TURNER | SALES      | 1500.00 |
27 -- | JAMES  | SALES      |  950.00 |
28 -- +--------+------------+---------+
View Code

28.列出所有部门的详细信息和人数
29.列出各种工作的最低工资及从事此工作的雇员姓名

 1 select
 2             job,min(sal) as minsal
 3 from 
 4             emp e 
 5 group by 
 6             job 
 7 -- # 将上表当做临时表 
 8 
 9 select
10     e.sal,e.job,e.ename
11 from
12         emp  e 
13 join 
14         (
15         select 
16                     job,min(sal) as minsal
17         from 
18                     emp e 
19         group by 
20                     job
21         ) t
22 on 
23         e.job=t.job and e.sal = t.minsal;
24 -- +---------+-----------+--------+
25 -- | sal     | job       | ename  |
26 -- +---------+-----------+--------+
27 -- |  800.00 | CLERK     | SMITH  |
28 -- | 1250.00 | SALESMAN  | WARD   |
29 -- | 1250.00 | SALESMAN  | MARTIN |
30 -- | 2450.00 | MANAGER   | CLARK  |
31 -- | 3000.00 | ANALYST   | SCOTT  |
32 -- | 5000.00 | PRESIDENT | KING   |
33 -- | 3000.00 | ANALYST   | FORD   |
34 -- +---------+-----------+--------+
View Code

30.列出各个部门MANAGER的最低薪金 

 1 select 
 2         e.deptno,min(e.sal) as minsal
 3 from 
 4         emp e 
 5 where 
 6         e.job='manager'
 7 group by 
 8         e.deptno;
 9 -- +--------+---------+
10 -- | deptno | minsal  |
11 -- +--------+---------+
12 -- |     20 | 2450.00 |
13 -- |     30 | 2850.00 |
14 -- +--------+---------+
View Code

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

 1 select 
 2         ename ,sal*12 as yearsal
 3 from 
 4         emp 
 5 order by 
 6         yearsal;
 7 -- +--------+----------+
 8 -- | ename  | yearsal  |
 9 -- +--------+----------+
10 -- | SMITH  |  9600.00 |
11 -- | JAMES  | 11400.00 |
12 -- | ADAMS  | 13200.00 |
13 -- | WARD   | 15000.00 |
14 -- | MARTIN | 15000.00 |
15 -- | MILLER | 15600.00 |
16 -- | TURNER | 18000.00 |
17 -- | ALLEN  | 19200.00 |
18 -- | CLARK  | 29400.00 |
19 -- | BLAKE  | 34200.00 |
20 -- | JONES  | 35700.00 |
21 -- | FORD   | 36000.00 |
22 -- | SCOTT  | 36000.00 |
23 -- | KING   | 60000.00 |
24 -- +--------+----------+
View Code

32.求出员工领导的薪水超过3000的员工名称和领导名称 

 1 select
 2         e.ename,a.ename as boss ,a.sal
 3 from 
 4         emp e 
 5 join 
 6         emp a 
 7 on  
 8         e.mgr = a.empno
 9 where 
10         a.sal>3000;
11 -- +-------+------+---------+
12 -- | ename | boss | sal     |
13 -- +-------+------+---------+
14 -- | JONES | KING | 5000.00 |
15 -- | BLAKE | KING | 5000.00 |
16 -- | CLARK | KING | 5000.00 |
17 -- +-------+------+---------+
View Code

33.求部门名称中带“S”字符的部门员工的工资合计、 部门人数

 1 select 
 2         d.dname,
 3         sum(e.sal) as sumsal,
 4         count(e.ename) as countEmp
 5 from 
 6         emp   e 
 7 join 
 8         dept  d 
 9 on 
10         e.deptno=d.deptno
11 where 
12         d.dname like '%s%'
13 group by 
14         d.dname;
15 -- +----------+----------+----------+
16 -- | dname    | sumsal   | countEmp |
17 -- +----------+----------+----------+
18 -- | RESEARCH | 13325.00 |        6 |
19 -- | SALES    |  9400.00 |        6 |
20 -- +----------+----------+----------+
View Code

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

 1 -- # 先备份一下表
 2 create table emp_bak as select * from emp;
 3 update emp_bak set sal = sal *1.1 where (to_days(now())-to_days(hiredate))/365>30;
 4 -- +-------+--------+-----------+------+------------+---------+---------+--------+
 5 -- | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
 6 -- +-------+--------+-----------+------+------------+---------+---------+--------+
 7 -- |  7396 | SMITH  | CLERK     | 7902 | 1980-12-17 |  880.00 |    NULL |     20 |
 8 -- |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1760.00 |  300.00 |     30 |
 9 -- |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1375.00 |  500.00 |     30 |
10 -- |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 3272.50 |    NULL |     20 |
11 -- |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1375.00 | 1400.00 |     30 |
12 -- |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 3135.00 |    NULL |     30 |
13 -- |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2695.00 |    NULL |     20 |
14 -- |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3300.00 |    NULL |     20 |
15 -- |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5500.00 |    NULL |     10 |
16 -- |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1650.00 |    0.00 |     30 |
17 -- |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1210.00 |    NULL |     20 |
18 -- |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 | 1045.00 |    NULL |     30 |
19 -- |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3300.00 |    NULL |     20 |
20 -- |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1430.00 |    NULL |     10 |
21 -- +-------+--------+-----------+------+------------+---------+---------+--------+
View Code
原文地址:https://www.cnblogs.com/d9e84208/p/10977986.html