首页 > MySQL > SQL 入门教程 > 23 SQL Join3

SQL Join3

1. 前言

上一小节中我们学习到了外连接,本小节我们将介绍一种特殊的连接——自连接

本小节测试数据如下,请先在数据库中执行:

DROP TABLE IF EXISTS imooc_employee;
CREATE TABLE imooc_employee
(
 id int PRIMARY KEY,
 employee_name varchar(20),
 salary int,
 manager_id int
);
INSERT INTO imooc_employee VALUES(1, 'Joe', 7000, 3);
INSERT INTO imooc_employee VALUES(2, 'Henry', 8000, 4);
INSERT INTO imooc_employee VALUES(3, 'Sam', 6000, NULL);
INSERT INTO imooc_employee VALUES(4, 'Pedro', 9000, 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 a.employee_name
FROM imooc_employee AS a
JOIN imooc_employee AS b
ON a.manager_id = b.id
WHERE a.salary > b.salary;

结果如下:

+---------------+
| employee_name |
+---------------+
| Joe           |
+---------------+

由于自连接是与自身进行连接,因此对于别名的要求是必须的,否则解析引擎无法判断出二者之间的关系。

3. 个人经验

  • 自连接虽然使用较少,但往往在有的时候可以起到奇效。

  • 在使用自连接时,请先指定好别名,然后将其当作两张表来处理,这样就不会引起歧义了。

本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
© 2023 PV138 · 站点地图 · 免责声明 · 联系我们 · 问题反馈