部门工资最高的员工

127 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

一、题目

表: Employee

+--------------+---------+
| 列名          | 类型    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+

id是此表的主键列。 departmentId是Department表中ID的外键。 此表的每一行都表示员工的ID、姓名和工资。它还包含他们所在部门的ID。  

表: Department

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

id是此表的主键列。 此表的每一行都表示一个部门的ID及其名称。  

编写SQL查询以查找每个部门中薪资最高的员工。 按 任意顺序 返回结果表。 查询结果格式如下例所示。

 

示例 1:

输入:
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)
  • 链接:leetcode.cn/problems/de…
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题

创建数据表

根据题意设置字段类型并填充数据表

Create table If Not Exists Employee
(
    id           int,
    name         varchar(255),
    salary       int,
    departmentId int
);
Create table If Not Exists Department
(
    id   int,
    name varchar(255)
);
Truncate table Employee;
insert into Employee values
('1', 'Joe', '70000', '1'),
('2', 'Jim', '90000', '1'),
('3', 'Henry', '80000', '2'),
('4', 'Sam', '60000', '2'),
('5', 'Max', '90000', '1');
Truncate table Department;
insert into Department values
('1', 'IT'),
('2', 'Sales');

解题思路

  • 根据题意,要查找每个部门薪资最高的员工
  • 首先需要将两表连接起来,这里可以使用join on e.departmentId = d.id 连接两表 这里拿到所有部门员工的薪水
  • 现在计算部门中员工薪水最多的,使用MAX(Salary)计算最高的薪水,同时以部门分组 GROUP BY DepartmentId这里能拿到最多薪水的员工
  • 如何第一步与第二步连接起来,这里使用in进行处理,其作用是查询某个范围内的数据。
  • 工作原理:
SELECT * FROM A WHERE (id, name) IN (SELECT id,name FROM B);)
等价于先执行(SELECT id FROM B),缓存结果;
然后执行SELECT * FROM A WHERE A.id = B.id and A.name = B.name

查询语句

SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM
    Employee
        JOIN
    Department ON Employee.DepartmentId = Department.Id
WHERE
    (Employee.DepartmentId , Salary) IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
	)
;

三、执行结果

image.png

四、总结

  • Join on : 内连接,用于返沪i满足连接条件的记录,与此相关的是外连接,是对内连接的扩展。默认情况下没有指定任何连接的为内连接。on 作为临时表的筛选条件,主要针对关联表,where作为最终表的筛选条件,是在两表join完成后,再执行。
  • in: A B 中,in适用于小表。in是把父查询表和子自查询表作hash连接。同时in在没有索引的情况下,随着in后面的数据量越多,in的执行效率不会有太大明显的下降。