在关系型数据库中,连接(JOIN) 是将分散的数据重新组合成完整信息的桥梁,上一节我们讲了内连接和笛卡尔积两种类型,本文将介绍剩下的3种外连接和自连接。
文章目录
- 一、外连接
-
- [1.1 左外连接 (LEFT OUTER JOIN)](#1.1 左外连接 (LEFT OUTER JOIN))
- [3. 右外连接 (RIGHT OUTER JOIN)](#3. 右外连接 (RIGHT OUTER JOIN))
- [4. 全外连接 (FULL OUTER JOIN)](#4. 全外连接 (FULL OUTER JOIN))
- 二、自连接 (SELF JOIN)
- 三、总结
一、外连接
下面通过MySQL示例数据库sakila作演示。
1.1 左外连接 (LEFT OUTER JOIN)
简称 LEFT JOIN 。它会返回左表(表 A)中的所有 行,如果右表(表 B)中没有匹配项,对应的列会显示为 NULL,即
- 内连接返回:A与B 的交集
- 左外连接返回:A 表的全部 + A 与 B 的交集。
示例: 查询"库存ID为4和5的租赁记录"。即使某个库存从未被租赁过,它的名字依然会出现在列表中,只是租赁日期部分为 NULL。
sql
SELECT i.inventory_id 库存ID, r.rental_date 租赁日期
FROM inventory i
LEFT JOIN rental r ON i.inventory_id = r.inventory_id
where i.inventory_id in (4,5)

左外连接(LEFT JOIN)是业务统计中最常用的连接类型,核心是 **"全量覆盖左表维度 + 匹配右表数据,无匹配则补 NULL",尤其在销售、运营类统计场景中不可或缺。以销售统计场景,即使销售人员无任何销售记录,他的名字也应该出现在最终结果中。
3. 右外连接 (RIGHT OUTER JOIN)
简称 RIGHT JOIN 。它与左连接逻辑完全对称,返回右表(表 B)中的所有行,很少使用,通常数据库也会转换左外连接处理。
4. 全外连接 (FULL OUTER JOIN)
只要其中一个表中存在匹配,全外连接就会返回行,它是左连接和右连接的结合体,也很少使用, 了解即可。
MySQL 不直接支持 FULL OUTER JOIN 关键字 ,需要通过 UNION 结合左连接和右连接的结果(将左外连接和右外连接结果合并)。
sql
-- MySQL 实现全连接的变通方法
SELECT * FROM table_a LEFT JOIN table_b ON a_id = b_id
UNION
SELECT * FROM table_a RIGHT JOIN table_b ON a_id = b_id;
二、自连接 (SELF JOIN)
自连接 是指表与其自身进行连接,这在处理表中具有层级结构(父子关系)的数据时非常有用。
示例: 现仅知道某个演员的actor_id是118(不知道姓),我想知道和他姓氏(last_name)相同的演员有哪些?
这个需求可以分两步完成:
1.先查询actor_id=118演员的姓并记录下来。
- 再查询
last_name等于上一步结果的记录。
或
通过连接的方式,用where条件定位到actor_id=118的记录,再与自己连接一次,找出所有姓氏相同的演员:
sql
SELECT
a.actor_id,
a.first_name,
a.last_name,
b.actor_id,
b.last_name,
b.first_name
FROM actor a
INNER JOIN actor b ON a.last_name = b.last_name
WHERE a.actor_id = 118;

注意:自连接必须为同一张表起两个不同的别名,否则 MySQL 会无法区分。
三、总结
| 如果你想要... | 连接类型 | 关键技术点 |
|---|---|---|
| 仅保留两边都能匹配的数据 | INNER JOIN | 交集,最常用,性能最高,不产生 NULL 值。 |
| 保留左边全部,即使右边没匹配 | LEFT JOIN | 左表优先 ,右表缺失部分自动补 NULL,常用于"补零"统计。 |
| 保留右边全部,即使左边没匹配 | RIGHT JOIN | 右表优先,通常改写为 LEFT JOIN,较少使用。 |
| 保留两边所有数据 | FULL JOIN | 并集 ,MySQL 需通过 UNION 实现,较少使用。 |
| 获得所有可能的排列组合 | CROSS JOIN | 笛卡尔积 不带条件,行数爆炸式增长,慎用。 |
| 处理同表内的层级关系 | SELF JOIN | 自关联 ,必须使用表别名来区分。 |
在实际的业务开发和数据统计场景中,内连接(INNER JOIN)+ 左外连接(LEFT JOIN)能覆盖约 95% 的 JOIN 需求,是 SQL 连接中绝对的 "主力组合",重点掌握这两种连接方式即可。