数据库每日一题---第1天:超过经理收入的员工

408 阅读2分钟

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

一、问题描述

表: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.建议用时10~25min

三、问题分析

1.子查询

子查询就是不断的向下延伸,因为每一次都需要重新遍历,所以适合数据量较少、表较少的情况。

这一题,我们先遍历数据库的数据,根据经理的薪资和员工的薪资对比就行了。

2.连接查询

连接查询就是提前将表连接成一个表,再从表中筛选出符合条件的记录。连接查询的部分表,如下所示:

2.png

我们只需要在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

五、测试结果

3.png

1.png