zoukankan      html  css  js  c++  java
  • 干货: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
  • 相关阅读:
    技巧和诀窍;在VS 2005里优化ASP.NET 2.0Web项目的Build性能(转)
    去噪:用于验证码图片识别的类续(C#代码)
    快速申请QQ号码的技巧(图文介绍)
    vs2005中调试js
    "Take the Internet Back“挂机程序(读信息挣美元)
    javascript的编写、调试
    硬盘速度和Visual Studio性能
    Java Swing的DragAndDrop机制
    Rails 的 SNS 准备
    学习,编译ffmpeg tutorial
  • 原文地址:https://www.cnblogs.com/d9e84208/p/10977986.html
Copyright © 2011-2022 走看看