问题起因于leetcode上一道sql查询的题目:
“部门工资最高的员工”
+--------------+---------+
| 列名 | 类型 |
+--------------+---------+
| id | int |
| name | varchar |
| salary | int |
| departmentId | int |
+--------------+---------+
id是此表的主键列。
departmentId是Department表中ID的外键。
此表的每一行都表示员工的ID、姓名和工资。它还包含他们所在部门的ID。
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| id | int |
| name | varchar |
+-------------+---------+
id是此表的主键列。
此表的每一行都表示一个部门的ID及其名称。
输入:
Employee 表:
+----+-------+--------+--------------+
| id | name | salary | departmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+
Department 表:
+----+-------+
| id | name |
+----+-------+
| 1 | IT |
| 2 | Sales |
+----+-------+
输出:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
| IT | Max | 90000 |
+------------+----------+--------+
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/department-highest-salary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我写的SQL(错误答案,不合符这道SQL题的解法):
select
d.name as Departmentm, e.name as Employee, e.salary as Salary
from Employee e left join Department as d on e.departmentId=d.id
group by e.departmentId
having e.salary=max(e.salary);
自己依照题意建了两张表,表信息如下:
查询出来的结果:
为什么会出现这种结果呢?因为sql语句中使用group by分组之后,再在having中拿e.salary来比较时。默认拿的是Employee表id为1和3的这两条记录来比较,其中Employee.id=1的记录,salary为7000,Employee.id=3的记录,salary为8000,所以只查出来了Employee.id=3的记录。
为了验证一下这个说法对不对,我把Employee.id=3这条记录的salary给改为6000,Employee.id=4这条记录的salary改位8000,再查询一下试试。
修改后的Employee表
查询结果:
由此可见,验证成功。
更详细的原因以后再了解清楚了再说明,这里先埋个坑。