原题题目
表:
Employee
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | | salary | int | | managerId | int | +-------------+---------+ id 是该表的主键(具有唯一值的列)。 该表的每一行都表示雇员的ID、姓名、工资和经理的ID。编写解决方案,找出收入比经理高的员工。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 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 是唯一挣得比经理多的雇员。
一、where语句
雇主和经理的信息存在于同一个表中,同时使用一张表格两次实现并集(笛卡尔积16条记录),本题只对雇员工资高于经理的人感兴趣,应用 WHERE 语句加 2 个判断条件。
SELECT
a.Name AS 'Employee'
FROM
Employee AS a,
Employee AS b
WHERE
a.ManagerId = b.Id
AND a.Salary > b.Salary
;
1、分解讲解
笛卡尔积的产生
知识点参考 MySql之笛卡尔积-CSDN博客
从两个表里使用 Select 语句可能会导致产生笛卡尔乘积 。在这种情况下,输出会产生 4*4=16 个记录。
SELECT *
FROM Employee AS a, Employee AS b
;
Id | Name | Salary | ManagerId | Id | Name | Salary | ManagerId |
---|---|---|---|---|---|---|---|
1 | Joe | 70000 | 3 | 1 | Joe | 70000 | 3 |
2 | Henry | 80000 | 4 | 1 | Joe | 70000 | 3 |
3 | Sam | 60000 | 1 | Joe | 70000 | 3 | |
4 | Max | 90000 | 1 | Joe | 70000 | 3 | |
1 | Joe | 70000 | 3 | 2 | Henry | 80000 | 4 |
2 | Henry | 80000 | 4 | 2 | Henry | 80000 | 4 |
3 | Sam | 60000 | 2 | Henry | 80000 | 4 | |
4 | Max | 90000 | 2 | Henry | 80000 | 4 | |
1 | Joe | 70000 | 3 | 3 | Sam | 60000 | |
2 | Henry | 80000 | 4 | 3 | Sam | 60000 | |
3 | Sam | 60000 | 3 | Sam | 60000 | ||
4 | Max | 90000 | 3 | Sam | 60000 | ||
1 | Joe | 70000 | 3 | 4 | Max | 90000 | |
2 | Henry | 80000 | 4 | 4 | Max | 90000 | |
3 | Sam | 60000 | 4 | Max | 90000 | ||
4 | Max | 90000 | 4 | Max | 90000 |
二、JOIN语句
实际上, JOIN
是一个更常用也更有效的将表连起来的办法,使用 ON
来指明条件。
SELECT
a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
;
三、子句条件查询
耗时长,不建议使用,可以锻炼思维
select
a.name as employee
from
employee a
where
a.salary>
(select b.salary
from employee b
where b.id = a.managerid);