1. 取得每个部门最高薪水的人员名称
/* 分析:
第一步:将每个部分进行分组,然后找出这个部分的最高工资
第二步:输出这个最高薪水的人员名称
*/
我自己做的:
SELECT ename,deptno,max(sal)
FROM emp
GROUP BY deptno;
错误:这样做只是找出了每个部门的最高工资,并不是取得每个部分最高薪水的人员名称
改正如下:
SELECT ename,deptno,sal
FROM emp
WHERE sal = ANY(
SELECT max(sal)
FROM emp
GROUP BY deptno
);
答案如下:
第一步:取得每个部门最高薪水(按照部门编号分组,找出每一组最大值)
mysql> select deptno,max(sal) as maxsal from emp group by deptno;
+--------+---------+
| deptno | maxsal |
+--------+---------+
| 10 | 5000.00 |
| 20 | 3000.00 |
| 30 | 2850.00 |
+--------+---------+
第二步:将以上的查询结果当做一张临时表t,
t和emp表连接,条件:t.deptno = e.deptno and t.maxsal = e.sal
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;
第一题的知识点回顾:
- 多行子查询要和多行比较操作符连用 | 操作符 | 含义 | | —- | —- | | IN | 和返回值的任意一个比较 | | ANY | 需要和单行比较操作符一起连用,和返回值中的某一个值比较 | | ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 | | SOME | 实际上是ANY的别名,作用相同,一般常使用ANY |
ANY 和 ALL 的区别:
any:左边的所用数据和子查询的结果比较,如果和子查询的某一个值相等就要,不相等就不要
all:左边的所用数据和子查询的结果比较,如果和子查询的所有值相等就要,不相等就不要