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

相关推荐
小白勇闯网安圈5 小时前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
努力的小雨6 小时前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图7 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl7 小时前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl7 小时前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl7 小时前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库
麻瓜code8 小时前
【Mysql】重新学一遍 SQL 执行顺序
数据库·sql
这个DBA有点耶9 小时前
数据库一体机架构演进:从硬件堆叠到软硬深度耦合
服务器·网络·数据库·硬件架构·运维开发·database·数据库架构
一只fish9 小时前
优化器架构对比:Oracle vs PostgreSQL vs MySQL
mysql·postgresql·oracle
安_10 小时前
RAG的向量数据库:为LLM提供语义搜索能力
数据库