部门工资最高的员工(SQL)

本文介绍如何使用SQL查询从Employee和Department表中找出每个部门薪酬最高的员工。通过子查询和连接操作,展示了如何筛选并展示各部最高薪酬者的名字、部门及薪资。

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

挺无聊的。

基于 MS SQL

 

题目是这样的:

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

+----+-------+--------+--------------+
| 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 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| Sales      | Henry    | 80000  |
+------------+----------+--------+
SELECT A.Name as Department, B.Name as Employee, B.Salary 
from Department A, Employee B 
where A.Id = B.DepartmentId
and B.Salary = (Select max(Salary) 
from Employee C 
where C.DepartmentId = A.Id)

 

### SQL查询薪水最高员工工资 要实现查询薪水最高员工工资,可以采用多种方法。以下是几种常见的解决方案: #### 方法一:使用 `MAX` 函数 通过聚合函数 `MAX()` 获取最高薪资,并结合子查询返回对应的员工信息。 ```sql SELECT e.name AS Employee, e.salary AS Salary FROM Employee e WHERE e.salary = ( SELECT MAX(e2.salary) FROM Employee e2 ); ``` 这种方法的核心在于利用子查询计算出整个表中的最大薪资值[^1],并将其与外部查询的薪资字段进行匹配。 --- #### 方法二:使用窗口函数 `ROW_NUMBER()` 窗口函数能够更灵活地处理数据排序问题。这里可以通过 `ROW_NUMBER()` 对薪资降序排列,并标记排名第一的数据。 ```sql WITH RankedSalaries AS ( SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank_num FROM Employee ) SELECT name AS Employee, salary AS Salary FROM RankedSalaries WHERE rank_num = 1; ``` 此方法的优势在于支持扩展性操作,比如筛选多个排名靠前的结果[^2]。 --- #### 方法三:自连接方式 通过将表格与其自身的分组结果相连,可以直接定位具有最高薪资的记录。 ```sql SELECT e1.name AS Employee, e1.salary AS Salary FROM Employee e1 JOIN ( SELECT departmentId, MAX(salary) AS max_salary FROM Employee GROUP BY departmentId ) e2 ON e1.departmentId = e2.departmentId AND e1.salary = e2.max_salary; ``` 这种方式特别适用于按部门或其他分类条件检索的情况[^4]。尽管题目未提及具体分类需求,但该逻辑同样可用于全局范围内的最高薪资查。 --- #### 综合分析 以上三种方案各有优劣: - **性能方面**:如果仅需简单求取单一数值,则直接运用 `MAX()` 的效率较高;而涉及复杂业务场景时,推荐考虑基于窗口函数或者自联结的设计思路。 - **适用场合**:当存在额外约束(如限定特定部门),第三种办法更具针对性[^3]。 最终选择取决于实际应用场景以及数据库引擎特性等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值