SQL架构
Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, ManagerId int)
Truncate table Employee
insert into Employee (Id, Name, Salary, ManagerId) values ('1', 'Joe', '70000', '3')
insert into Employee (Id, Name, Salary, ManagerId) values ('2', 'Henry', '80000', '4')
insert into Employee (Id, Name, Salary, ManagerId) values ('3', 'Sam', '60000', 'None')
insert into Employee (Id, Name, Salary, ManagerId) values ('4', 'Max', '90000', 'None')
题目描述:
Employee
表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
+----+-------+--------+-----------+
| Id | Name | Salary | ManagerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
+----+-------+--------+-----------+
给定 Employee
表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe
是唯一一个收入超过他的经理的员工。
+----------+
| Employee |
+----------+
| Joe |
+----------+
解法
方法1:使用JOIN
SELECT e1.Name AS Employee
FROM Employee AS e1
RIGHT JOIN Employee AS e2
ON e1.ManagerId = e2.Id
WHERE e1.Salary > e2.Salary
耗时:520ms
方法2:使用WHERE
SELECT e1.Name AS Employee
FROM Employee AS e1,
Employee AS e2
WHERE e1.ManagerId IS NOT NULL
AND e1.ManagerId = e2.Id
AND e1.Salary > e2.Salary
耗时:560ms
方法3:使用子查询
SELECT Name AS Employee
FROM Employee AS e1
WHERE e1.ManagerId IS NOT NULL
AND e1.Salary >(
SELECT Salary
FROM Employee AS e2
WHERE e1.ManagerId = e2.Id)
耗时:828ms