一、问题描述
表:Employee
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
| salary | int |
| managerId | int |
+-------------+---------+
复制代码
Id
是该表的主键。该表的每一行都表示雇员的 ID、姓名、工资和经理的 ID。
编写一个 SQL 查询来查找收入比经理高的员工。
以 任意顺序
返回结果表。
题目链接:超过经理收入的员工
二、题目要求
样例
输入:
Employee 表:
+----+-------+--------+-----------+
| id | name | salary | managerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | Null |
| 4 | Max | 90000 | Null |
+----+-------+--------+-----------+
输出:
+----------+
| Employee |
+----------+
| Joe |
+----------+
解释: Joe 是唯一挣得比经理多的雇员。
复制代码
考察
三、问题分析
1.子查询
子查询就是不断的向下延伸,因为每一次都需要重新遍历,所以适合数据量较少、表较少的情况。
这一题,我们先遍历数据库的数据,根据经理的薪资和员工的薪资对比就行了。
2.连接查询
连接查询就是提前将表连接成一个表,再从表中筛选出符合条件的记录。连接查询的部分表,如下所示:
我们只需要在 where 子句里面添加两个条件判断就行,一个是经理的 id 号要等于一开始的 id 号,第二个是员工的工资要大于经理才行。
筛选出满足这两种条件的记录,输出其姓名就行。
3.join 优化
我们可以摒弃 where,直接使用 join 优化连接,条件还是上面确定的两个条件,只不过用在 on 后面。
四、编码实现
1.子查询
select e.name as Employee
from Employee as e
where salary>
(select salary from Employee where id=e.managerId)
复制代码
2.连接查询
select a.name as Employee
from
Employee as a,Employee as b
where a.managerId=b.id and a.salary>b.salary
复制代码
3.join 优化
select a.name as Employee
from
Employee as a join Employee as b
on a.managerId=b.id and a.salary>b.salary
复制代码
五、测试结果
评论