//该写法错误,可能存在其他部门员工的工资和该工资相等
mysql> select e.ename,t.maxsal from emp e join (select max(sal) as maxsal from emp group by deptno) t on e.sal=t.maxsal;
+-------+---------+
| ename | maxsal |
+-------+---------+
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| BLAKE | 2850.00 |
| KING | 5000.00 |
+-------+---------+
4 rows in set (0.04 sec)
//正确写法
mysql> select e.ename,e.deptno,t.maxsal from emp e join (select deptno,max(sal) as maxsal from emp group by deptno) t on e.sal=t.maxsal and t.deptno=e.deptno;
+-------+--------+---------+
| ename | deptno | maxsal |
+-------+--------+---------+
| SCOTT | 20 | 3000.00 |
| FORD | 20 | 3000.00 |
| BLAKE | 30 | 2850.00 |
| KING | 10 | 5000.00 |
+-------+--------+---------+
4 rows in set (0.04 sec)
2.哪些人的薪水在部门的平均薪水之上
mysql> select e.ename,e.sal,t.maxsal,t.deptno from emp e join (select deptno,avg(sal) as maxsal from emp group by deptno) t on e.deptno=t.deptno and e.sal>t.maxsal;
+-------+---------+-------------+--------+
| ename | sal | maxsal | deptno |
+-------+---------+-------------+--------+
| ALLEN | 1600.00 | 1566.666667 | 30 |
| JONES | 2975.00 | 2175.000000 | 20 |
| BLAKE | 2850.00 | 1566.666667 | 30 |
| SCOTT | 3000.00 | 2175.000000 | 20 |
| KING | 5000.00 | 2916.666667 | 10 |
| FORD | 3000.00 | 2175.000000 | 20 |
+-------+---------+-------------+--------+
6 rows in set (0.04 sec)
3.取得部门中(所有人的)平均的薪水等级
mysql> select e.ename,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
+--------+-------+
| ename | grade |
+--------+-------+
| SMITH | 1 |
| JAMES | 1 |
| ADAMS | 1 |
| WARD | 2 |
| MARTIN | 2 |
| MILLER | 2 |
| TURNER | 3 |
| ALLEN | 3 |
| CLARK | 4 |
| BLAKE | 4 |
| JONES | 4 |
| SCOTT | 4 |
| FORD | 4 |
| KING | 5 |
+--------+-------+
14 rows in set (0.16 sec)
4.不准用组函数(MAX),取得最高薪水
//方案一 sal降序,limit分页
mysql> select ename,sal from emp order by sal desc limit 1;
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
1 row in set (0.04 sec)
//方案二 表的自连接
mysql> select ename,sal from emp where sal not in(select distinct a.sal from emp a join emp b on a.sal<b.sal);
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
1 row in set (0.15 sec)
5.取得平均薪水最高的部门的部门编号
//第一种 排序
mysql> select deptno,avgsal from (select deptno,avg(sal) as avgsal from emp group by deptno) as a order by avgsal desc limit 1;
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 10 | 2916.666667 |
+--------+-------------+
1 row in set (0.20 sec)
//第二种
mysql> select deptno,avg(sal) as avgsal from emp group by deptno having avgsal=(select max(avgsal) from (select deptno,avg(sal) as avgsal from emp group by deptno) as depts);
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 10 | 2916.666667 |
+--------+-------------+
1 row in set (0.04 sec)
6.取得平均薪水最高的部门的部门名称
mysql> select dname from dept where deptno=(select deptno from emp group by deptno having avg(sal)=(select max(avgsal) from (select deptno,avg(sal) as avgsal from emp group by deptno) as depts));
+------------+
| dname |
+------------+
| ACCOUNTING |
+------------+
1 row in set (0.04 sec)
mysql> select d.dname,avg(e.sal) as avgsal from emp e join dept d on e.deptno = d.deptno group by d.dname order by avgsal desc limit 1;
+------------+-------------+
| dname | avgsal |
+------------+-------------+
| ACCOUNTING | 2916.666667 |
+------------+-------------+
1 row in set (0.04 sec)
7.求平均薪水的等级最高的部门名称
//该写法未考虑同时有两个部门平均薪水等级最高
mysql> select d.deptno,de.dname,s.grade,d.avgsal from (select deptno,avg(sal) as avgsal from emp group by deptno) d join salgrade s on d.avgsal between s.losal and s.hisal join dept de on de.deptno=d.deptno order by grade desc limit 1;
+--------+----------+-------+-------------+
| deptno | dname | grade | avgsal |
+--------+----------+-------+-------------+
| 20 | RESEARCH | 4 | 2175.000000 |
+--------+----------+-------+-------------+
1 row in set (0.05 sec)
//正确写法一
mysql> select d.deptno,de.dname,s.grade,d.avgsal from (select deptno,avg(sal) as avgsal from emp group by deptno) d join salgrade s on d.avgsal between s.losal and s.hisal join dept de on de.deptno=d.deptno where s.grade=(select g.grade from (select deptno,avg(sal) as avgsal from emp group by deptno) f join salgrade g on f.avgsal between g.losal and g.hisal order by g.grade desc limit 1);
+--------+------------+-------+-------------+
| deptno | dname | grade | avgsal |
+--------+------------+-------+-------------+
| 10 | ACCOUNTING | 4 | 2916.666667 |
| 20 | RESEARCH | 4 | 2175.000000 |
+--------+------------+-------+-------------+
2 rows in set (0.05 sec)
//正确写法二
mysql> select x.deptno,x.dname,x.grade,x.avgsal from (select d.deptno,de.dname,s.grade,d.avgsal from (select deptno,avg(sal) as avgsal from emp group by deptno) d join salgrade s on d.avgsal between s.losal and s.hisal join dept de on de.deptno=d.deptno order by grade desc) as x group by x.deptno,x.grade having x.grade=(select max(s.grade) from (select deptno,avg(sal) as avgsal from emp group by deptno) d join salgrade s on d.avgsal between s.losal and s.hisal);
+--------+------------+-------+-------------+
| deptno | dname | grade | avgsal |
+--------+------------+-------+-------------+
| 20 | RESEARCH | 4 | 2175.000000 |
| 10 | ACCOUNTING | 4 | 2916.666667 |
+--------+------------+-------+-------------+
2 rows in set (0.06 sec)
8.取得比普通员工的最高薪水还要高的领导人姓名
mysql> select ename,sal from emp where sal>(select max(sal) from emp where empno not in(select distinct mgr from emp where mgr is not null));
+-------+---------+
| ename | sal |
+-------+---------+
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+-------+---------+
6 rows in set (0.04 sec)
9.取出薪水最高的前五名普通员工
mysql> select ename,sal from emp where empno not in(select distinct mgr from emp where mgr is not null) order by sal desc limit 5;
+--------+---------+
| ename | sal |
+--------+---------+
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
+--------+---------+
5 rows in set (0.04 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.04 sec)
11.取得最后入职的五名员工
mysql> select ename,hiredate from emp order by hiredate desc limit 5;
+--------+------------+
| ename | hiredate |
+--------+------------+
| ADAMS | 1987-05-23 |
| SCOTT | 1987-04-19 |
| MILLER | 1982-01-23 |
| JAMES | 1981-12-03 |
| FORD | 1981-12-03 |
+--------+------------+
5 rows in set (0.04 sec)
12.取得每个薪水等级有多少员工
mysql> select grade,count(*) from (select e.ename,s.grade from emp e join salgrade s on e.sal between s.losal and hisal) as g group by grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
| 1 | 3 |
| 2 | 3 |
| 3 | 2 |
| 4 | 5 |
| 5 | 1 |
+-------+----------+
5 rows in set (0.04 sec)
13.
14.列出所有员工及领导的名字
mysql> select a.ename as '员工', ifnull(b.ename,'没有上级') as'领导' from emp a left join emp b on a.mgr =b.empno;
+--------+----------+
| 员工 | 领导 |
+--------+----------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| KING | 没有上级 |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+----------+
14 rows in set (0.05 sec)
15.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
mysql> select x.ename,x.empno,y.dname from (select a.empno,a.ename,a.deptno,a.hiredate from emp a where a.hiredate <(select hiredate from emp b where b.empno =a.mgr)) as x join dept as y on x.deptno=y.deptno;
+-------+-------+------------+
| ename | empno | dname |
+-------+-------+------------+
| SMITH | 7369 | RESEARCH |
| ALLEN | 7499 | SALES |
| WARD | 7521 | SALES |
| JONES | 7566 | RESEARCH |
| BLAKE | 7698 | SALES |
| CLARK | 7782 | ACCOUNTING |
+-------+-------+------------+
6 rows in set (0.04 sec)
16.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
mysql> select d.dname,e.ename from dept d left join emp e on e.deptno=d.deptno order by d.dname;
+------------+--------+
| dname | ename |
+------------+--------+
| ACCOUNTING | MILLER |
| ACCOUNTING | KING |
| ACCOUNTING | CLARK |
| OPERATIONS | NULL |
| RESEARCH | FORD |
| RESEARCH | ADAMS |
| RESEARCH | SCOTT |
| RESEARCH | JONES |
| RESEARCH | SMITH |
| SALES | JAMES |
| SALES | TURNER |
| SALES | BLAKE |
| SALES | MARTIN |
| SALES | WARD |
| SALES | ALLEN |
+------------+--------+
15 rows in set (0.04 sec)
17.列出至少5个员工的所有部门
mysql> select deptno,count(*) from emp group by deptno having count(*)>=5;
+--------+----------+
| deptno | count(*) |
+--------+----------+
| 20 | 5 |
| 30 | 6 |
+--------+----------+
2 rows in set (0.03 sec)
18.列出薪水比“SMITH”多的所有员工信息
mysql> 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 |
+--------+---------+
13 rows in set (0.04 sec)
19.列出所有做“CLERK”工作(办事员)的姓名及其部门名称,部门的人数
mysql> select x.ename,x.dname,y.co from (select e.ename,d.dname,d.deptno from (select ename,deptno from emp where job='CLERK') as e join dept as d on e.deptno=d.deptno) as x join (select deptno,count(*) as co from emp group by deptno) as y on x.deptno=y.deptno;
+--------+------------+----+
| ename | dname | co |
+--------+------------+----+
| SMITH | RESEARCH | 5 |
| JAMES | SALES | 6 |
| ADAMS | RESEARCH | 5 |
| MILLER | ACCOUNTING | 3 |
+--------+------------+----+
4 rows in set (0.04 sec)
20.列出最低薪资大于1500的各种工作及其从事次工作的全部雇佣人员
mysql> select a.job,e.ename,a.minsal from (select job,min(sal) as minsal from emp group by job having min(sal)>1500) a join emp e on a.job =e.job;
+-----------+-------+---------+
| job | ename | minsal |
+-----------+-------+---------+
| ANALYST | SCOTT | 3000.00 |
| ANALYST | FORD | 3000.00 |
| MANAGER | CLARK | 2450.00 |
| MANAGER | BLAKE | 2450.00 |
| MANAGER | JONES | 2450.00 |
| PRESIDENT | KING | 5000.00 |
+-----------+-------+---------+
6 rows in set (0.04 sec)
21.列出在部门“SALES”<销售部>工作的员工的姓名,假定不知道销售部的部门编号
mysql> select ename from emp where deptno=(select deptno from dept where dname='SALES');
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| BLAKE |
| TURNER |
| JAMES |
+--------+
6 rows in set (0.04 sec)
22.列出薪水高于公司平均薪水的所有员工,所在部门,上级领导,雇员的工资等级
mysql> select a.ename,c.dname,d.ename,b.grade from (select ename,deptno,mgr,sal from emp where sal>(select avg(sal) from emp)) a join salgrade b on a.sal between b.losal and b.hisal join dept c on a.deptno =c.deptno left join emp d on a.mgr=d.empno;
+-------+------------+-------+-------+
| ename | dname | ename | grade |
+-------+------------+-------+-------+
| FORD | RESEARCH | JONES | 4 |
| SCOTT | RESEARCH | JONES | 4 |
| JONES | RESEARCH | KING | 4 |
| BLAKE | SALES | KING | 4 |
| CLARK | ACCOUNTING | KING | 4 |
| KING | ACCOUNTING | NULL | 5 |
+-------+------------+-------+-------+
6 rows in set (0.05 sec)
23.列出与“SCOTT”从事相同工作的所有员工及部门名称
mysql> select a.ename,b.dname from (select ename,deptno from emp where job=(select job from emp where ename='SCOTT')) a join dept b on a.deptno=b.deptno where ename!='SCOTT';
+-------+----------+
| ename | dname |
+-------+----------+
| FORD | RESEARCH |
+-------+----------+
1 row in set (0.04 sec)
24.列出薪水等于部门30中员工的薪水的其他员工的姓名和薪水
mysql> select e.ename,e.sal from emp e join (select distinct sal from emp where deptno=30) b on e.sal=b.sal and e.deptno!=30;
Empty set
25.列出薪水高于在部门30工作的所有员工的薪水的员工姓名和薪水,部门名称
mysql> select e.ename,e.sal,d.dname from emp e join dept d on d.deptno=e.deptno where e.sal>(select max(sal) from emp where deptno=30);
+-------+---------+------------+
| ename | sal | dname |
+-------+---------+------------+
| JONES | 2975.00 | RESEARCH |
| SCOTT | 3000.00 | RESEARCH |
| FORD | 3000.00 | RESEARCH |
| KING | 5000.00 | ACCOUNTING |
+-------+---------+------------+
4 rows in set (0.03 sec)
26.列出在每个部门工作的员工数量,平均工资和平均服务期限。
mysql> select d.dname,ifnull(avg(sal),0),count(ename),ifnull(avg(timestampdiff(YEAR,hiredate,now())),0) as year from emp e right join dept d on e.deptno=d.deptno group by d.deptno;
+------------+--------------------+--------------+---------+
| dname | ifnull(avg(sal),0) | count(ename) | year |
+------------+--------------------+--------------+---------+
| ACCOUNTING | 2916.666667 | 3 | 40.3333 |
| RESEARCH | 2175.000000 | 5 | 38.4000 |
| SALES | 1566.666667 | 6 | 40.5000 |
| OPERATIONS | 0.000000 | 0 | 0.0000 |
+------------+--------------------+--------------+---------+
4 rows in set (0.05 sec)
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.04 sec)
28.列出所有部门的详细信息和人数
mysql> select d.dname,d.deptno,d.loc,ifnull(e.co,0) from dept d left join (select deptno,count(*) as co from emp group by deptno) e on d.deptno=e.deptno;
+------------+--------+----------+----------------+
| dname | deptno | loc | ifnull(e.co,0) |
+------------+--------+----------+----------------+
| ACCOUNTING | 10 | NEW YORK | 3 |
| RESEARCH | 20 | DALLAS | 5 |
| SALES | 30 | CHICAGO | 6 |
| OPERATIONS | 40 | BOSTON | 0 |
+------------+--------+----------+----------------+
4 rows in set (0.04 sec)
29.列出各种工资的最低工资及从事此工作的雇员姓名
mysql> select b.job, b.minsal,e.ename from (select job,min(sal) as minsal from emp group by job) b join emp e on b.job=e.job and b.minsal =e.sal;
+-----------+---------+--------+
| job | minsal | ename |
+-----------+---------+--------+
| ANALYST | 3000.00 | SCOTT |
| ANALYST | 3000.00 | FORD |
| CLERK | 800.00 | SMITH |
| MANAGER | 2450.00 | CLARK |
| PRESIDENT | 5000.00 | KING |
| SALESMAN | 1250.00 | WARD |
| SALESMAN | 1250.00 | MARTIN |
+-----------+---------+--------+
7 rows in set (0.04 sec)
30.列出各个部门的MANAGER(领导)的最低薪水
mysql> select distinct deptno,min(sal) from emp where job='MANAGER' group by deptno;
+--------+----------+
| deptno | min(sal) |
+--------+----------+
| 10 | 2450.00 |
| 30 | 2850.00 |
| 20 | 2975.00 |
+--------+----------+
3 rows in set (0.05 sec)
31.列出所有员工的年工资,按年薪从低到高排序
mysql> select ename,(sal+ifnull(comm,0))*12 as yearsal from emp order by yearsal;
+--------+----------+
| 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.05 sec)
32.求出员工领导的薪水超过3000的员工名称与领导名称
mysql> select x.ename as '员工',y.ename as '领导' from emp x join (select distinct a.mgr,b.ename from emp a join emp b on a.mgr=b.empno and b.sal>3000) y on x.mgr=y.mgr;
+-------+------+
| 员工 | 领导 |
+-------+------+
| JONES | KING |
| BLAKE | KING |
| CLARK | KING |
+-------+------+
3 rows in set (0.05 sec)
33.求出部门名称中,带‘S’字符的部门员工的工资合计,部门人数
mysql> select b.deptno ,b.dname,ifnull(sum(a.sal),0),count(a.ename) from emp a right join (select deptno,dname from dept where dname like '%S%') b on a.deptno=b.deptno group by deptno,dname;
+--------+------------+----------------------+----------------+
| deptno | dname | ifnull(sum(a.sal),0) | count(a.ename) |
+--------+------------+----------------------+----------------+
| 20 | RESEARCH | 10875.00 | 5 |
| 30 | SALES | 9400.00 | 6 |
| 40 | OPERATIONS | 0.00 | 0 |
+--------+------------+----------------------+----------------+
3 rows in set (0.05 sec)