一、问题描述
表: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 Employeefrom Employee as ewhere salary>(select salary from Employee where id=e.managerId)
复制代码
2.连接查询
select a.name as Employeefrom Employee as a,Employee as bwhere a.managerId=b.id and a.salary>b.salary
复制代码
3.join 优化
select a.name as Employeefrom Employee as a join Employee as bon a.managerId=b.id and a.salary>b.salary
复制代码
五、测试结果
评论