25、练习
1、取得每个部门最高薪水的人员名称
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 |
+-------+--------+---------+
2、哪些人的薪水在部门的平均薪水之上
select e.ename,e.sal,t.* from emp e
join (select deptno,avg(sal) as avgsal from emp group by deptno) t
on t.deptno = e.deptno and e.sal > t.avgsal ;
+-------+---------+--------+-------------+
| ename | sal | deptno | avgsal |
+-------+---------+--------+-------------+
| ALLEN | 1600.00 | 30 | 1566.666667 |
| JONES | 2975.00 | 20 | 2175.000000 |
| BLAKE | 2850.00 | 30 | 1566.666667 |
| SCOTT | 3000.00 | 20 | 2175.000000 |
| KING | 5000.00 | 10 | 2916.666667 |
| FORD | 3000.00 | 20 | 2175.000000 |
+-------+---------+--------+-------------+
3、取得部门中(所有人的)平均的薪水等级
select e.deptno,avg(s.grade) from emp e
left join salgrade s
on e.sal between s.losal and hisal
group by e.deptno;
+--------+--------------+
| deptno | avg(s.grade) |
+--------+--------------+
| 20 | 2.8000 |
| 30 | 2.5000 |
| 10 | 3.6667 |
+--------+--------------+
4、不准用组函数(Max ),取得最高薪水
select ename,sal from emp e
order by sal desc limit 1;
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
5、取得平均薪水最高的部门的部门编号
select ename,avg(sal) as avgsal,deptno from emp
group by deptno
order by avgsal desc
limit 1;
+-------+-------------+--------+
| ename | avgsal | deptno |
+-------+-------------+--------+
| CLARK | 2916.666667 | 10 |
+-------+-------------+--------+
select deptno,avg(sal) as avgsal
from emp group by deptno
having
avgsal = (select max(t.avgsal)
from (select avg(sal) as avgsal from emp group by deptno) t)
6、取得平均薪水最高的部门的部门名称
select d.dname,t.avgsal as maxavg from dept d right join
(select * from (select avg(sal) as avgsal,deptno from emp group by deptno order by avgsal desc limit 1) temp) t
on t.deptno = d.deptno;
+------------+-------------+
| dname | maxavg |
+------------+-------------+
| ACCOUNTING | 2916.666667 |
+------------+-------------+
7、求平均薪水的等级最低的部门的部门名称
select d.deptno,d.dname,t.avgsal,s.grade from dept d
right join (select avg(sal) avgsal,deptno from emp group by deptno
order by avgsal limit 1 ) t
on d.deptno = t.deptno
left join salgrade s
on t.avgsal between losal and hisal;
+--------+-------+-------------+-------+
| deptno | dname | avgsal | grade |
+--------+-------+-------------+-------+
| 30 | SALES | 1566.666667 | 3 |
+--------+-------+-------------+-------+
8、取得比普通员工(员工代码没有在 mgr 字段上出现的) 的最高薪水还要高的领导人姓名
select e.empno,e.ename,e.sal from emp e
where empno in (select distinct(mgr) from emp where mgr is not null) and
e.sal > (select max(sal) from emp e
where empno not in (select distinct(mgr) from emp where mgr is not null));
+-------+-------+---------+
| empno | ename | sal |
+-------+-------+---------+
| 7566 | JONES | 2975.00 |
| 7698 | BLAKE | 2850.00 |
| 7782 | CLARK | 2450.00 |
| 7788 | SCOTT | 3000.00 |
| 7839 | KING | 5000.00 |
| 7902 | FORD | 3000.00 |
+-------+-------+---------+
9、取得薪水最高的前五名员工
select empno,ename,sal from emp order by sal desc limit 5;
```sql
+-------+-------+---------+
| empno | ename | sal |
+-------+-------+---------+
| 7839 | KING | 5000.00 |
| 7902 | FORD | 3000.00 |
| 7788 | SCOTT | 3000.00 |
| 7566 | JONES | 2975.00 |
| 7698 | BLAKE | 2850.00 |
+-------+-------+---------+
10、取得薪水最高的第六到第十名员工
select empno,ename,sal from emp order by sal desc limit 5,5;
+-------+--------+---------+
| empno | ename | sal |
+-------+--------+---------+
| 7782 | CLARK | 2450.00 |
| 7499 | ALLEN | 1600.00 |
| 7844 | TURNER | 1500.00 |
| 7934 | MILLER | 1300.00 |
| 7521 | WARD | 1250.00 |
+-------+--------+---------+
11、取得最后入职的 5 名员工
select empno,ename,hiredate from emp order by hiredate desc limit 5;
+-------+--------+------------+
| empno | ename | hiredate |
+-------+--------+------------+
| 7876 | ADAMS | 1987-05-23 |
| 7788 | SCOTT | 1987-04-19 |
| 7934 | MILLER | 1982-01-23 |
| 7900 | JAMES | 1981-12-03 |
| 7902 | FORD | 1981-12-03 |
+-------+--------+------------+
12、取得每个薪水等级有多少员工
select s.grade,count(s.grade) as total from emp e
left join salgrade s on e.sal between losal and hisal group by s.grade;
+-------+-------+
| grade | total |
+-------+-------+
| 1 | 3 |
| 2 | 3 |
| 3 | 2 |
| 4 | 5 |
| 5 | 1 |
+-------+-------+
13、 略
14、列出所有员工及领导的姓名
select e.ename,t.ename as mgr from emp e
left join (select e.empno,e.ename from emp e where empno in (select mgr from emp where mgr is not null)) t
on e.mgr = t.empno ;
+--------+-------+
| ename | mgr |
+--------+-------+
| 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 |
+--------+-------+
15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
select e.ename,t.ename as mgr,e.hiredate from emp e
left join (select e.empno,e.ename,e.hiredate from emp e where empno in (select mgr from emp where mgr is not null)) t
on e.mgr = t.empno where e.hiredate < t.hiredate;
+-------+-------+------------+
| ename | mgr | hiredate |
+-------+-------+------------+
| SMITH | FORD | 1980-12-17 |
| ALLEN | BLAKE | 1981-02-20 |
| WARD | BLAKE | 1981-02-22 |
| JONES | KING | 1981-04-02 |
| BLAKE | KING | 1981-05-01 |
| CLARK | KING | 1981-06-09 |
+-------+-------+------------+
16、 列出部门名称和这些部门的员工信息, 同时列出那些没有员工的部门
select d.dname,e.ename from emp e
right join dept d on e.deptno = d.deptno;
+------------+--------+
| dname | ename |
+------------+--------+
| RESEARCH | SMITH |
| SALES | ALLEN |
| SALES | WARD |
| RESEARCH | JONES |
| SALES | MARTIN |
| SALES | BLAKE |
| ACCOUNTING | CLARK |
| RESEARCH | SCOTT |
| ACCOUNTING | KING |
| SALES | TURNER |
| RESEARCH | ADAMS |
| SALES | JAMES |
| RESEARCH | FORD |
| ACCOUNTING | MILLER |
| OPERATIONS | NULL |
+------------+--------+
17、列出至少有 5 个员工的所有部门
select d.deptno,d.dname from emp e left join dept d
on e.deptno = d.deptno group by e.deptno having count(*) >= 5;
+--------+----------+
| deptno | dname |
+--------+----------+
| 20 | RESEARCH |
| 30 | SALES |
+--------+----------+
18、列出薪金比"SMITH" 多的所有员工信息
select ename,sal from emp where sal >
(select sal from emp where ename = 'SMITH');
+--------+---------+
| ename | sal |
+--------+---------+
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
19、 列出所有"CLERK"( 办事员) 的姓名及其部门名称, 部门的人数
select e.ename,e.job,d.dname,d.deptno,t.total from emp e left join
dept d on e.deptno = d.deptno
left join (select deptno, count(*) as total from emp group by deptno) t
on d.deptno = t.deptno
where e.job = 'CLERK';
+--------+-------+------------+--------+-------+
| ename | job | dname | deptno | total |
+--------+-------+------------+--------+-------+
| SMITH | CLERK | RESEARCH | 20 | 5 |
| ADAMS | CLERK | RESEARCH | 20 | 5 |
| JAMES | CLERK | SALES | 30 | 6 |
| MILLER | CLERK | ACCOUNTING | 10 | 3 |
+--------+-------+------------+--------+-------+
20、列出最低薪金大于 1500 的各种工作及从事此工作的全部雇员人数
select e.ename,e.sal,e.job,t.total from emp e
right join (select e.job,min(e.sal) as minsal,count(*) as total from emp e group by job having minsal >1500) t
on t.job = e.job group by job ;
+-------+---------+-----------+-------+
| ename | sal | job | total |
+-------+---------+-----------+-------+
| JONES | 2975.00 | MANAGER | 3 |
| SCOTT | 3000.00 | ANALYST | 2 |
| KING | 5000.00 | PRESIDENT | 1 |
+-------+---------+-----------+-------+
21、列出在部门"SALES"< 销售部> 工作的员工的姓名, 假定不知道销售部的部门编号.
select ename from emp where deptno = (select deptno from dept where dname = 'SALES');
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| BLAKE |
| TURNER |
| JAMES |
+--------+
22、列出薪金高于公司平均薪金的所有员工, 所在部门, 上级领导, 雇员的工资等级.
select e.ename,d.dname,g.ename as mname,s.grade,e.sal from emp e left join dept d
on e.deptno = d.deptno
left join (select * from emp) g on e.mgr = g.empno
left join salgrade s on e.sal between s.losal and s.hisal where e.sal> (select avg(sal) from emp);
+-------+------------+-------+-------+---------+
| ename | dname | mname | grade | sal |
+-------+------------+-------+-------+---------+
| CLARK | ACCOUNTING | KING | 4 | 2450.00 |
| JONES | RESEARCH | KING | 4 | 2975.00 |
| SCOTT | RESEARCH | JONES | 4 | 3000.00 |
| FORD | RESEARCH | JONES | 4 | 3000.00 |
| BLAKE | SALES | KING | 4 | 2850.00 |
| KING | ACCOUNTING | NULL | 5 | 5000.00 |
+-------+------------+-------+-------+---------+
23、 列出与"SCOTT" 从事相同工作的所有员工及部门名称
select e.deptno, e.ename,e.job,d.dname from emp e
left join dept d on e.deptno = d.deptno where e.job = (select job from emp where ename = 'SCOTT') and e.ename <> 'SCOTT' ;
+--------+-------+---------+----------+
| deptno | ename | job | dname |
+--------+-------+---------+----------+
| 20 | FORD | ANALYST | RESEARCH |
+--------+-------+---------+----------+
24、列出薪金等于部门 30 中员工的薪金的其他员工的姓名和薪金.
select e.ename,e.sal from emp e where e.sal in
(select distinct(e.sal) from emp e where e.deptno = 30) and e.deptno <> 30;
Empty set (0.00 sec)
25、列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金. 部门名称
select e.ename,e.sal,d.dname from emp e left join dept d
on e.deptno = d.deptno where e.sal >
(select max(e.sal) from emp e where e.deptno = 30) and e.deptno <> 30;
+-------+---------+------------+
| ename | sal | dname |
+-------+---------+------------+
| KING | 5000.00 | ACCOUNTING |
| JONES | 2975.00 | RESEARCH |
| SCOTT | 3000.00 | RESEARCH |
| FORD | 3000.00 | RESEARCH |
+-------+---------+------------+
26、列出在每个部门工作的员工数量, 平均工资和平均服务期限
select d.deptno, count(e.ename) as total, ifnull(avg(e.sal),0) as avgsal,
ifnull(avg(timestampdiff(YEAR, hiredate, now())), 0) as avgdate
from emp e right join dept d on e.deptno=d.deptno group by e.deptno;
+--------+-------+-------------+---------+
| deptno | total | avgsal | avgdate |
+--------+-------+-------------+---------+
| 20 | 5 | 2175.000000 | 38.2000 |
| 30 | 6 | 1566.666667 | 40.5000 |
| 10 | 3 | 2916.666667 | 40.0000 |
| 40 | 0 | 0.000000 | 0.0000 |
+--------+-------+-------------+---------+
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 |
±-------±-----------±--------+
28、列出所有部门的详细信息和人数
select d.*,total from dept d left join
(select count(e.deptno) as total,d.deptno from emp e right join dept d on d.deptno = e.deptno group by d.deptno) e
on e.deptno = d.deptno;
+--------+------------+----------+-------+
| DEPTNO | DNAME | LOC | total |
+--------+------------+----------+-------+
| 10 | ACCOUNTING | NEW YORK | 3 |
| 20 | RESEARCH | DALLAS | 5 |
| 30 | SALES | CHICAGO | 6 |
| 40 | OPERATIONS | BOSTON | 0 |
+--------+------------+----------+-------+
29、列出各种工作的最低工资及从事此工作的雇员姓名
select e.ename,e.job, min(e.sal) from emp e group by e.job;
+-------+-----------+------------+
| ename | job | min(e.sal) |
+-------+-----------+------------+
| SMITH | CLERK | 800.00 |
| ALLEN | SALESMAN | 1250.00 |
| JONES | MANAGER | 2450.00 |
| SCOTT | ANALYST | 3000.00 |
| KING | PRESIDENT | 5000.00 |
+-------+-----------+------------+
30、列出各个部门的 MANAGER( 领导) 的最低薪金
select deptno, min(sal) from emp where job = 'MANAGER' group by deptno;
select e.ename,e.sal,e.deptno from emp e where e.sal
in (select min(e.sal) as minsal from emp e where e.empno
in (select distinct(mgr) from emp where mgr is not null) group by e.deptno);
+-------+---------+--------+
| ename | sal | deptno |
+-------+---------+--------+
| JONES | 2975.00 | 20 |
| BLAKE | 2850.00 | 30 |
| CLARK | 2450.00 | 10 |
+-------+---------+--------+
31、列出所有员工的 年工资, 按 年薪从低到高排序
select ename, (e.sal + ifnull(comm,0)) * 12 as sunsal
from emp e order by sunsal;
+--------+----------+
| ename | sunsal |
+--------+----------+
| 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 |
+--------+----------+
32、求出员工领导的薪水超过3000的员工名称与领导
select e.ename,g.ename as mnage,e.sal from emp e left join (select * from emp) g
on e.mgr = g.empno where g.sal > 3000;
+-------+-------+---------+
| ename | mnage | sal |
+-------+-------+---------+
| JONES | KING | 2975.00 |
| BLAKE | KING | 2850.00 |
| CLARK | KING | 2450.00 |
+-------+-------+---------+
33、求出部门名称中, 带’S’字符的部门员工的工资合计、部门人数
select d.dname,count(e.ename) as total,ifnull(sum(e.sal),0) as sumsal, d.deptno from emp e right join dept d
on d.deptno = e.deptno where d.dname like '%S%' group by d.deptno;
+------------+-------+----------+--------+
| dname | total | sumsal | deptno |
+------------+-------+----------+--------+
| RESEARCH | 5 | 10875.00 | 20 |
| SALES | 6 | 9400.00 | 30 |
| OPERATIONS | 0 | 0.00 | 40 |
+------------+-------+----------+--------+
34、给任职日期超过 30 年的员工加薪 10%.
update emp set sal = sal * 1.1 where timestampdiff(YEAR, hiredate, now()) > 30;