老杜mysql 34题

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

mysql> select d.dname,h.* from dept d join (select s.grade,t.* from salgrade s join (select avg (sal) as avg, deptno from emp group by deptno) t on t.avg > s.losal and t.avg < s.hisal) h on d.deptno = h.deptno
    -> where (select h.grade from  dept d join (select s.grade,t.* from salgrade s join (select avg (sal) as avg, deptno from emp group by deptno) t on t.avg > s.losal and t.avg < s.hisal) h on d.deptno = h.deptno order by grade limit 1) = h.grade;
+-------+-------+-------------+--------+
| dname | grade | avg         | deptno |
+-------+-------+-------------+--------+
| SALES |     3 | 1566.666667 |     30 |
+-------+-------+-------------+--------+

8、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名。

在这里插入代码片mysql> select distinct e1.ename from emp e1 join emp e2 on e1.empno = e2.mgr where e1.sal > (select sal from emp where ename not in (select distinct e1.ename from emp e1 join emp e2 on e1.empno = e2.mgr) order by sal desc limit 1);
+-------+
| ename |
+-------+
| FORD  |
| BLAKE |
| KING  |
| JONES |
| SCOTT |
| CLARK |
+-------+

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

mysql> select ename, sal from emp where sal >= (select,t.sal from (select sal from emp order by sal desc limit 4,1) t) order by sal desc;
+-------+---------+
| 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;
+--------+---------+
| ename  | sal     |
+--------+---------+
| CLARK  | 2450.00 |
| ALLEN  | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD   | 1250.00 |
+--------+---------+
5 rows in set (0.00 sec)

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

 select ename, hiredate from emp order by hiredate limit 9, 5;
+--------+------------+
| ename  | hiredate   |
+--------+------------+
| JAMES  | 1981-12-03 |
| FORD   | 1981-12-03 |
| MILLER | 1982-01-23 |
| SCOTT  | 1987-04-19 |
| ADAMS  | 1987-05-23 |
+--------+------------+
5 rows in set (0.00 sec)

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

mysql> select s.grade,count(*) from emp e join salgrade s on e.sal between losal and hisal group by s.grade order by grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
|     1 |        3 |
|     2 |        3 |
|     3 |        2 |
|     4 |        5 |
|     5 |        1 |
+-------+----------+
5 rows in set (0.00 sec)

14、列出所有员工及领导姓名

mysql> select e1.ename as '员工姓名', e2.ename as '领导姓名' from emp e1 left join emp e2 on e1.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 t.empno, t.ename_e, d.dname from dept d join (select e1.empno, e1.ename as ename_e, e1.deptno, e2.ename as '领导姓名' from emp e1 left join emp e2 on e1.mgr = e2.empno where e1.hiredate < e2.hiredate) t on d.deptno = t.deptno;
+-------+---------+------------+
| empno | ename_e | dname      |
+-------+---------+------------+
|  7369 | SMITH   | RESEARCH   |
|  7499 | ALLEN   | SALES      |
|  7521 | WARD    | SALES      |
|  7566 | JONES   | RESEARCH   |
|  7698 | BLAKE   | SALES      |
|  7782 | CLARK   | ACCOUNTING |
+-------+---------+------------+
6 rows in set (0.00 sec)

16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
(其实不需要全连接,写的有问题)

mysql> select d.dname, e.* from dept d left join (select * from emp order by deptno) e on e.deptno = d.deptno union select d.dname, e.* from dept d right join (select * from emp order by deptno) e on e.deptno = d.deptno
    -> ;
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| dname      | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| ACCOUNTING |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
| ACCOUNTING |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
| ACCOUNTING |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
| RESEARCH   |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
| RESEARCH   |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
| RESEARCH   |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
| RESEARCH   |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
| RESEARCH   |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
| SALES      |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
| SALES      |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
| SALES      |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
| SALES      |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
| SALES      |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
| SALES      |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
| OPERATIONS |  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
15 rows in set (0.00 sec)

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

mysql> select d.dname, e.*
    -> from dept d
    -> join (select deptno, count(*) from emp group by deptno) e
    -> on d.deptno = e.deptno
    -> where e.`count(*)` >= 5;
+----------+--------+----------+
| dname    | deptno | count(*) |
+----------+--------+----------+
| RESEARCH |     20 |        5 |
| SALES    |     30 |        6 |
+----------+--------+----------+
2 rows in set (0.00 sec)

18、列出薪资比SMITH多的所有员工的信息

mysql> 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、列出所有办事员(CLEARK)的姓名以及它的部门名称,部门的人数

mysql> select h.ename, d.dname, h.count from (select b.ename, a.count, b.deptno from (select count(*) count, deptno from emp group by deptno) a join (select * from emp where job = 'clerk') b on a.deptno = b.deptno) h join dept d on h.deptno = d.deptno;
+--------+------------+-------+
| ENAME  | dname      | count |
+--------+------------+-------+
| SMITH  | RESEARCH   |     5 |
| ADAMS  | RESEARCH   |     5 |
| JAMES  | SALES      |     6 |
| MILLER | ACCOUNTING |     3 |
+--------+------------+-------+
4 rows in set (0.00 sec)

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

select e.job, count(*) from emp e join (select min(sal) min, job from emp group by job having min > 1500) h on h.job = e.job group by job;
+-----------+----------+
| job       | count(*) |
+-----------+----------+
| MANAGER   |        3 |
| ANALYST   |        2 |
| PRESIDENT |        1 |
+-----------+----------+
3 rows in set (0.00 sec)

21、列出在部门 “SALES” 工作的员工的姓名,假定不知道销售部的部门编号。
此题坑,略过

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

mysql> select e.ename,d.dname, s.grade, e2.ename from emp e join dept d on d.deptno = e.deptno join salgrade s on e.sal >= s.losal and e.sal <= s.hisal left join emp e2 on e.mgr = e2.empno where e.sal > (select avg(sal) from emp);
+-------+------------+-------+-------+
| ename | dname      | grade | ename |
+-------+------------+-------+-------+
| FORD  | RESEARCH   |     4 | JONES |
| SCOTT | RESEARCH   |     4 | JONES |
| CLARK | ACCOUNTING |     4 | KING  |
| BLAKE | SALES      |     4 | KING  |
| JONES | RESEARCH   |     4 | KING  |
| KING  | ACCOUNTING |     5 | NULL  |
+-------+------------+-------+-------+
6 rows in set (0.00 sec)

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

mysql> select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno where job = (select job from emp where ename = 'SCOTT');
+-------+----------+
| ename | dname    |
+-------+----------+
| SCOTT | RESEARCH |
| FORD  | RESEARCH |
+-------+----------+
2 rows in set (0.00 sec)

24、列出薪资等于部门30中员工的薪资的其它员工的姓名和资金(这题神坑)

mysql> select ename, sal from emp where sal in (select distinct sal from emp where deptno = 30) and deptno <> 30;
Empty set (0.00 sec)

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

mysql> 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);
+-------+---------+------------+
| ename | sal     | dname      |
+-------+---------+------------+
| JONES | 2975.00 | RESEARCH   |
| SCOTT | 3000.00 | RESEARCH   |
| KING  | 5000.00 | ACCOUNTING |
| FORD  | 3000.00 | RESEARCH   |
+-------+---------+------------+
4 rows in set (0.00 sec)

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

没搞懂

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

mysql> select e.ename, d.dname, e.sal from emp e join dept d on e.deptno = d.deptno;
+--------+------------+---------+
| ename  | dname      | sal     |
+--------+------------+---------+
| SMITH  | RESEARCH   |  800.00 |
| ALLEN  | SALES      | 1600.00 |
| WARD   | SALES      | 1250.00 |
| JONES  | RESEARCH   | 2975.00 |
| MARTIN | SALES      | 1250.00 |
| BLAKE  | SALES      | 2850.00 |
| CLARK  | ACCOUNTING | 2450.00 |
| SCOTT  | RESEARCH   | 3000.00 |
| KING   | ACCOUNTING | 5000.00 |
| TURNER | SALES      | 1500.00 |
| ADAMS  | RESEARCH   | 1100.00 |
| JAMES  | SALES      |  950.00 |
| FORD   | RESEARCH   | 3000.00 |
| MILLER | ACCOUNTING | 1300.00 |
+--------+------------+---------+
14 rows in set (0.00 sec)

28、列出所有部门的详细信息和人数

mysql> select d.*,ifnull( e.`count(*)`,0) from dept d left join (select count(*), deptno from emp group by deptno) e on d.deptno = e.deptno;
+--------+------------+----------+-------------------------+
| DEPTNO | DNAME      | LOC      | ifnull( e.`count(*)`,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、列出各种工作的最低工资及从事此工作的雇员姓名

mysql> select e.ename, t.* from emp e join (select min(sal) as min, job from emp group by job) t on e.sal = t.min and e.job = t.job;
+--------+---------+-----------+
| ename  | min     | job       |
+--------+---------+-----------+
| SMITH  |  800.00 | CLERK     |
| WARD   | 1250.00 | SALESMAN  |
| MARTIN | 1250.00 | SALESMAN  |
| CLARK  | 2450.00 | MANAGER   |
| SCOTT  | 3000.00 | ANALYST   |
| KING   | 5000.00 | PRESIDENT |
| FORD   | 3000.00 | ANALYST   |
+--------+---------+-----------+
7 rows in set (0.00 sec)

30.列出各个部门的manager的最低薪资

mysql> select min(sal), deptno from emp where job = 'manager' group by deptno;
+----------+--------+
| min(sal) | deptno |
+----------+--------+
|  2975.00 |     20 |
|  2850.00 |     30 |
|  2450.00 |     10 |
+----------+--------+
3 rows in set (0.00 sec)

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

mysql> select ename, (sal + ifnull(comm, 0)) * 12 as yearSal from emp order by yearsal asc;
+--------+----------+
| ename  | yearSal  |
+--------+----------+
| 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 |
| SCOTT  | 36000.00 |
| FORD   | 36000.00 |
| KING   | 60000.00 |
+--------+----------+
14 rows in set (0.00 sec)

32、求出员工领导的薪水超过3000的员工名称与领导名称

mysql> select e1.ename as '员工', e2.ename as '领导', e2.sal as '领导薪资' from emp e1 left join emp e2 on e1.mgr = e2.empno where e2.sal >3000;
+-------+------+----------+
| 员工  | 领导 | 领导薪资 |
+-------+------+----------+
| JONES | KING |  5000.00 |
| BLAKE | KING |  5000.00 |
| CLARK | KING |  5000.00 |
+-------+------+----------+
3 rows in set (0.00 sec)

33、求出部门名称中带‘s’字符的部门员工的工资合计,部门人数

mysql> select
    -> d.deptno, d.dname, d.loc, count(e.ename), sum(e.sal)
    -> from
    -> emp e
    -> right join
    -> dept d
    -> on
    -> e.deptno = d.deptno
    -> where
    -> d.dname like '%s%'
    -> group by
    -> d.deptno, d.dname, d.loc;
+--------+------------+---------+----------------+------------+
| deptno | dname      | loc     | count(e.ename) | sum(e.sal) |
+--------+------------+---------+----------------+------------+
|     20 | RESEARCH   | DALLAS  |              5 |   10875.00 |
|     30 | SALES      | CHICAGO |              6 |    9400.00 |
|     40 | OPERATIONS | BOSTON  |              0 |       NULL |
+--------+------------+---------+----------------+------------+
3 rows in set (0.00 sec)

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

mysql> update emp set sal = sal * 1.1 where timestampdiff(year, hiredate, now()) > 30;
Query OK, 14 rows affected (0.03 sec)
Rows matched: 14  Changed: 14  Warnings: 0

mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  880.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1760.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1375.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 3272.50 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1375.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 3135.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2695.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3300.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5500.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1650.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1210.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 | 1045.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3300.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1430.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值