1. 取得每个部门最高薪水的人员名称

  1. /* 分析:
  2. 第一步:将每个部分进行分组,然后找出这个部分的最高工资
  3. 第二步:输出这个最高薪水的人员名称
  4. */
  5. 我自己做的:
  6. SELECT ename,deptno,max(sal)
  7. FROM emp
  8. GROUP BY deptno;
  9. 错误:这样做只是找出了每个部门的最高工资,并不是取得每个部分最高薪水的人员名称
  10. 改正如下:
  11. SELECT ename,deptno,sal
  12. FROM emp
  13. WHERE sal = ANY(
  14. SELECT max(sal)
  15. FROM emp
  16. GROUP BY deptno
  17. );
  18. 答案如下:
  19. 第一步:取得每个部门最高薪水(按照部门编号分组,找出每一组最大值)
  20. mysql> select deptno,max(sal) as maxsal from emp group by deptno;
  21. +--------+---------+
  22. | deptno | maxsal |
  23. +--------+---------+
  24. | 10 | 5000.00 |
  25. | 20 | 3000.00 |
  26. | 30 | 2850.00 |
  27. +--------+---------+
  28. 第二步:将以上的查询结果当做一张临时表t
  29. temp表连接,条件:t.deptno = e.deptno and t.maxsal = e.sal
  30. select
  31. e.ename, t.*
  32. from
  33. emp e
  34. join
  35. (select deptno,max(sal) as maxsal from emp group by deptno) t
  36. on
  37. t.deptno = e.deptno and t.maxsal = e.sal;

第一题的知识点回顾:

  • 多行子查询要和多行比较操作符连用 | 操作符 | 含义 | | —- | —- | | IN | 和返回值的任意一个比较 | | ANY | 需要和单行比较操作符一起连用,和返回值中的某一个值比较 | | ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 | | SOME | 实际上是ANY的别名,作用相同,一般常使用ANY |

ANY 和 ALL 的区别:
any:左边的所用数据和子查询的结果比较,如果和子查询的某一个值相等就要,不相等就不要
all:左边的所用数据和子查询的结果比较,如果和子查询的所有值相等就要,不相等就不要

2.