题目来源于力扣的数据库题库,链接为:
在MySQL中,什么是自连接?
自连接形式:SELECT 字段列表 FROM 表A 别名a JOIN 表A 别名b ON 条件;
自己和自己连接,通过某些条件实现查询
——题目要求
表: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 是唯一挣得比经理多的雇员。
——代码实现
select
X.name Employee
from Employee X JOIN Employee Y
ON Y.id=X.managerId
and X.salary > Y.salary;
这里使用自连接即可解除题目,而且执行的速度很快。只有382ms。
首先将左侧的表重命名为X,右边的表重命名为Y,令Y的id=X的managerId,说明Y既有ID也有managerId,说明Y表为经理,相对应的,X就是员工了。利用AND列出对应的比较条件即可解决问题
——拓展:关于MySQL的查询代码执行顺序
使用MySQL查询代码时,知道查询顺序是非常重要的,否则会因为乱起别名导致查询混乱,使代码出现隐形的错误。
MySQL的查询代码通用模块如下:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
-执行顺序
- FROM/
- WHERE/
- GROUP BY/
- HAVING/
- SELECT/
- ORDER BY/
- LIMIt
注意SELECT的执行顺序在HAVING之后