SQL大师之路 11 外连接和自连接

在关系型数据库中,连接(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演员的姓并记录下来。

  1. 再查询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 连接中绝对的 "主力组合",重点掌握这两种连接方式即可。

相关推荐
kishu_iOS&AI13 分钟前
LLM —— Milvmus向量数据库
数据库·人工智能·milvus
名不经传的养虾人17 分钟前
从0到1:企业级AI项目迭代日记 Vol.46|三个检索源、缓存限流、深度整合——联网检索一日冲刺
数据库·人工智能·agent·ai编程·ai工作流·企业ai
BugShare24 分钟前
Mac 上原生开发的开源免费、尽享丝滑数据库工具
数据库·macos·开源
Java爱好狂.24 分钟前
阿里1658页2026最新Java面试题总结(含答案)
数据库·redis·程序员·java面试·java面试题·java编程·java八股文
babe小鑫31 分钟前
2026工商管理专业学习数据分析的价值分析
学习·数据挖掘·数据分析
王小王-12334 分钟前
基于 Hadoop + Flask 的电动汽车数据分析与可视化系统设计与实现
hadoop·数据分析·flask·电动汽车·新能源汽车数据分析·新能源汽车销量分析·新能源汽车销售分析
YangYang9YangYan37 分钟前
学数据分析对应用统计学与大数据专业的价值
大数据·数据挖掘·数据分析
jieyucx39 分钟前
《Go 数据库编程开篇:彻底打通 database/sql 与 MySQL 驱动的连接池调优密码》
数据库·sql·golang
白露与泡影42 分钟前
深入理解MySQL事务隔离级别:MVCC机制与Next-Key Lock如何解决幻读问题?
数据库·mysql
Gong-Yu43 分钟前
MySQL数据库运维——性能优化进阶2️⃣
运维·数据库·mysql·性能优化