LeetCode:Department Highest Salary - 部门内最高工资

本文介绍如何使用两种不同的SQL方法来找出每个部门内薪资最高的员工。一种方法是通过子查询找到各部门最高薪资,另一种方法是在部门内比较薪资是否高于或等于所有其他员工薪资。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目名称

Department Highest Salary(部门内最高工资)

2、题目地址

https://leetcode.com/problems/department-highest-salary/

3、题目内容

表Employee包括四列:Id、Name、Salary、DepartmentId

+----+-------+--------+--------------+
| Id | Name  | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
+----+-------+--------+--------------+

表Department表中包括了公司的所有部门

+----+----------+
| Id | Name     |
+----+----------+
| 1  | IT       |
| 2  | Sales    |
+----+----------+

现要求写一个SQL,求出某一部门内领取最高工资的员工。

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| Sales      | Henry    | 80000  |
+------------+----------+--------+

4、初始化数据库脚本

在MySQL数据库中建立一个名为LEETCODE的数据库,用MySQL命令行中的source命令执行下面脚本:

-- 执行脚本前必须建立名为LEETCODE的DATABASE
USE LEETCODE;
 
DROP TABLE IF EXISTS Employee;
CREATE TABLE Employee (
  Id INT NOT NULL PRIMARY KEY,
  Name VARCHAR(50),
  Salary INT,
  DepartmentId INT
);

INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (1, 'Joe', 70000, 1);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (2, 'Henry', 80000, 2);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (3, 'Sam', 60000, 2);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (4, 'Max', 90000, 1);

DROP TABLE IF EXISTS Department;
CREATE TABLE Department (
  Id INT NOT NULL PRIMARY KEY,
  Name VARCHAR(50)
);

INSERT INTO Department (Id, Name) VALUES (1, 'IT');
INSERT INTO Department (Id, Name) VALUES (2, 'Sales');

5、解题SQL1

一个思路是,先求出各个部门的最高工资,再考察Employee表中,工资数等于所在部门的最高工资的员工,即为所求。

SELECT D.Name AS Department, E.Name AS Employee, MAXS_D.MAXS AS Salary
FROM Employee AS E, Department AS D, (
  SELECT MAX(Salary) AS MAXS, DepartmentId
  FROM Employee
  GROUP BY DepartmentId) AS MAXS_D
WHERE E.Salary = MAXS_D.MAXS AND E.DepartmentId = D.Id AND 
  E.DepartmentId = MAXS_D.DepartmentId;

6、解题SQL2

另一个思路是,在同一部门中,工资大于等于该部门所有员工的员工,即为所求。

SELECT D.Name AS Department, E.Name AS Employee, E.Salary AS Salary
FROM Employee AS E, Department AS D
WHERE E.DepartmentId = D.Id AND Salary >= ALL(
  SELECT Salary 
  FROM Employee E_TMP
  WHERE E_TMP.DepartmentId = E.DepartmentId);

END

转载于:https://my.oschina.net/Tsybius2014/blog/493715

### LeetCode SQL 题目推荐刷题顺序 对于初学者到高级学习者的SQL技能提升,建议按照由易至难的原则逐步深入练习。以下是精心挑选并整理的一系列LeetCode上的SQL题目,旨在帮助用户循序渐进地掌握SQL查询技巧。 #### 基础阶段 此阶段主要目的是熟悉基本语法结构以及常用函数的应用。 - **175. Combine Two Tables** 掌握如何通过`JOIN`操作来组合多个的数据[^1]。 - **182. Duplicate Emails** 学习识别重复记录的方法,并理解子查询的作用。 - **196. Delete Duplicate Email Addresses** 练习使用DELETE语句删除不需要的数据行。 #### 进阶阶段 随着难度增加,开始接触更复杂的逻辑判断多条件筛选。 - **176. Second Highest Salary** 实现获取特定排名数据的功能,比如本例中的第二高薪水问题。 - **183. Customers Who Never Order** 利用外连接(OUTER JOIN)找出那些从未下单过的客户信息。 - **595. Big Countries** 结合WHERE子句和聚合函数完成对大规模国家列的有效过滤。 #### 高级阶段 挑战更高层次的任务,涉及窗口函数(Window Function),CTE(Common Table Expression)等高级特性。 - **1070. Product Sales Analysis I~III** 应用多种分析工具解决销售数据分析场景下的复杂需- **184. Department Highest Salary** 使用窗口函数计算部门内部员工薪资分布情况,找到各部门最高薪者。 - **1581. Customer Who Visited but Did Not Make Any Transactions** 尝试构建公共达式简化嵌套查询过程,提高代码可读性和执行效率。 为了更好地巩固所学知识点,鼓励读者每做完一道题后都仔细阅读官方解答和其他优秀选手分享的经验贴,从中汲取灵感不断完善自己的思维方式和技术水平。 ```sql -- 获取第二高的工资示例 SELECT MAX(Salary) AS SecondHighestSalary FROM Employee WHERE Salary != (SELECT MAX(Salary) FROM Employee); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值