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

相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull5 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
2501_944934736 小时前
直播运营需要哪些数据分析能力?场观、停留、成交和投流怎么联动分析
数据挖掘·数据分析
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven