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

相关推荐
zklgin1 小时前
PostgreSQL常用时间函数与时间计算提取示例说明
数据库·postgresql
曾阿伦1 小时前
SQL CRUD 用法详解:从入门到实战的完整指南
数据库·sql
gaozhiyong08132 小时前
SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
spring boot·mysql·sqlserver
让学习成为一种生活方式2 小时前
Swiss-Prot 注释--生信工具079
数据库
2601_948606182 小时前
MySQL B+树索引高度计算与性能阈值探讨
数据库·b树·mysql
lierenvip2 小时前
mysql用户名怎么看
数据库·mysql
qq_416018722 小时前
用户认证与授权:使用JWT保护你的API
jvm·数据库·python
镜舟科技2 小时前
华农保险 x StarRocks:从单机瓶颈到架构焕新,探索 OLAP 的涅槃之路
starrocks·数据分析·olap·物化视图·金融行业·华农保险
KKKlucifer2 小时前
国产化适配与自主可控:国内安全厂商文档安全平台核心技术构建
大数据·数据库·人工智能