SQL Join3
1. 前言
在上一小节中我们学习到了外连接,本小节我们将介绍一种特殊的连接——自连接
。
本小节测试数据如下,请先在数据库中执行:
DROP TABLE IF EXISTS imooc_employee;CREATE TABLE imooc_employee( id int PRIMARY KEY, employee_name varchar(), salary int, manager_id int);INSERT INTO imooc_employee VALUES(, 'Joe', , );INSERT INTO imooc_employee VALUES(, 'Henry', , );INSERT INTO imooc_employee VALUES(, 'Sam', , NULL);INSERT INTO imooc_employee VALUES(, 'Pedro', , NULL);
说明: 我们新建一个 imooc_employee 表,imooc_employee 表包含了所有员工,员工的经理(manager_id)也属于员工,如果manager_id 字段为 NULL,则表示该员工暂无经理。
2. 自连接
自连接指的是与自身进行连接,即表 A 与表 A 自身进行连接,是一种特殊的连接方式。
2.1 例1、查询薪水
请编写 SQL 语句,查询imooc_employee
中收入超过其经理的
员工的姓名。
分析:
我们可以把 manager_id 理解为一个外键,这个外键指向经理 id,只不过是表与其自身的关联;因此可以充分利用连接操作,将表 imooc_employee 与其自身连接,连接条件是 manager_id 和 id。
表 a 可以理解为员工表,表 b 理解为经理表,筛选条件为员工表的薪水大于经理表薪水。
语句:
整理可得语句如下:
SELECT .employee_nameFROM imooc_employee AS JOIN imooc_employee AS ON .manager_id = .idWHERE .salary > .salary;
结果如下:
+---------------+ | employee_name | +---------------+ | Joe | +---------------+
由于自连接是与自身进行连接,因此对于别名
的要求是必须的,否则解析引擎无法判断出二者之间的关系。
3. 个人经验
自连接虽然使用较少,但往往在有的时候可以起到奇效。
在使用自连接时,请先指定好
别名
,然后将其当作两张表来处理,这样就不会引起歧义了。