LeetCode#超过经理收入的员工

161 阅读2分钟

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

一、题目

表:Employee 

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| salary      | int     |
| managerId   | int     |
+-------------+---------+

Id是该表的主键。 该表的每一行都表示雇员的ID、姓名、工资和经理的ID。  

编写一个SQL查询来查找收入比经理高的员工。 以 任意顺序 返回结果表。 查询结果格式如下所示。

示例 1:

输入: 
Employee 表:
+----+-------+--------+-----------+
| id | name  | salary | managerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | Null      |
| 4  | Max   | 90000  | Null      |
+----+-------+--------+-----------+
输出: 
+----------+
| Employee |
+----------+
| Joe      |
+----------+

解释: Joe 是唯一挣得比经理多的雇员。

  • 来源:力扣(LeetCode)
  • 链接:leetcode.cn/problems/em…
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

创建数据表

根据题意创建数据表,设置数据类型

CREATE TABLE IF NOT EXISTS Employee (
	id INT,
	NAME VARCHAR(255),
	salary INT,
	managerId INT
)
INSERT INTO Employee VALUES 
(1, 'Joe', 70000, 3),
(2, 'Henry', 80000, 4),
(3, 'Sam', 60000, NULL),
(4, 'Max', 90000, NULL)

这里注意数据的格式,int类型和varchar类型,并没有主键

解题

  • 根据题意,这里要查找比经理挣得多得雇员,首先要把每个雇员得经理找到
  • 这里可以使用a.managerId = b.id,找到每个雇员得经理
  • 拿到每个雇员得经理后,对比每个雇员与经理得薪水,这里使用a.salary > b.salary;
  • 用and将两个公式相加,得到最后得雇员和经理,这里只需要展示雇员,因此,只需要展示a.Name
  • 根据最后得输出,这里需要用假名a.Name Employee,AS可以省略掉
  • 这里可以使用where语句与条件连接,也可以使用join on 与条件连接

代码

WHERE

SELECT a.Name Employee FROM Employee a, Employee b WHERE a.managerId = b.id AND a.salary > b.salary;

JOIN ON

SELECT a.Name Employee FROM Employee a JOIN Employee b ON a.`managerId` = b.`id` AND a.`salary`>b.`salary`

三、执行结果

WHERE image.png JOIN ON

image.png

四、总结

这里主要是用WHERE和JOIN ON 的区别 WHERE是对最后关联出来的结果进行筛选过滤,不会考虑左右关联 JOIN中的ON是对两个表的笛卡尔积进行过滤,如果是左右链接则会忽略主表中不满足条件的数据,不进行过滤。