持续创作,加速成长!这是我参与「掘金日新计划 · 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
JOIN ON
四、总结
这里主要是用WHERE和JOIN ON 的区别 WHERE是对最后关联出来的结果进行筛选过滤,不会考虑左右关联 JOIN中的ON是对两个表的笛卡尔积进行过滤,如果是左右链接则会忽略主表中不满足条件的数据,不进行过滤。