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

相关推荐
ha_lydms几秒前
MaxCompute中加密与解密函数
大数据·数据库·数据仓库·hadoop·dataworks·maxcompute·odps
Shadow(⊙o⊙)22 分钟前
MySQL内置函数
数据库·mysql
笃行3501 小时前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
夜雪一千1 小时前
MySQL 常用 DEFAULT 默认值一览表
mysql
千里码aicood1 小时前
基于ECharts的电商平台用户行为数据分析
信息可视化·数据分析·echarts
鼓掌MVP1 小时前
SQL 语句是一个典型的 DDL
sql·ddl
快乐的木子李2 小时前
mysql-26.7.0-linux26.7.0下载安装
数据库·mysql
excel3 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
知行产研3 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
千里码aicood3 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类