MySQL 8.0 连接查询详解:内连接、左/右外连接及全连接实现
本文详解 MySQL 8.0 中的多表连接查询,涵盖内连接的多种写法及自然连接原理,深入解析左/右外连接的数据保留逻辑,并展示如何通过 UNION 在 MySQL 中实现全外连接。
内连接(Inner Join)
内连接是数据库中最常用的连接方式。其核心逻辑是从两个表的笛卡尔积中筛选出满足 ON 或 WHERE 条件的记录,即求两个表的交集。
自然连接与等值连接的区别
虽然两者都基于条件匹配,但处理方式有所不同:
- 等值连接:
=运算符下的 θ-join。需手动指定比较列,结果集中可能包含重复的属性列。 - 自然连接:一种特殊的等值连接。自动识别并比较两表中名称相同的属性列,且在结果中自动消除重复列。若两表无同名属性列,则退化为笛卡尔积。
操作准备:示例数据
假设存在两张表 aaa 和 bbb,我们需要查找它们在属性 C、D、E 上相等的记录。
表 aaa 数据结构示意:
表 bbb 数据结构示意:
实际操作:等值连接 vs 自然连接
1. 等值连接查询
使用传统 WHERE 子句显式指定连接条件。
SELECT * FROM aaa, bbb WHERE aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
执行结果示意:
2. 自然连接查询
使用 NATURAL JOIN 关键字,MySQL 自动对齐同名列。
-- 自动匹配所有同名属性列并去重 SELECT * FROM aaa NATURAL JOIN bbb;
执行结果示意:
通过对比可见,自然连接消除了相同属性列的冗余,而等值连接需要开发者精确指定关联字段。
内连接的四五种实现方式
在 MySQL 中,内连接有以下几种等效写法:
第一种:隐式内连接 (WHERE)
兼容旧版 SQL 标准,语法简洁但不推荐用于复杂联表。
SELECT * FROM aaa, bbb WHERE aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
第二种:显式内连接 (INNER JOIN)
语义最明确,推荐使用的标准写法。
SELECT * FROM aaa INNER JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
第三种:简写连接 (JOIN)
JOIN 默认为 INNER JOIN,效果同上。
SELECT * FROM aaa JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
第四种:强制顺序连接 (STRAIGHT_JOIN)
指示优化器先扫描左表 aaa,再扫描右表 bbb。通常仅在特定性能调优场景下使用,普通业务中性能略低且缺乏灵活性。
SELECT * FROM aaa STRAIGHT_JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
外连接(Outer Join)
外连接除了返回满足连接条件的交集数据外,还会保留主表(驱动表)中未匹配到的空行,并用 NULL 填充。
左外连接(LEFT JOIN)
逻辑定义: 返回左表 aaa 的所有记录,以及右表 bbb 中匹配成功的记录。若右表无匹配,则右表字段显示为 NULL。
左连接原理示意:
操作实现
SELECT * FROM aaa LEFT JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
左连接结果示意:
右外连接(RIGHT JOIN)
逻辑定义: 与左连接相反,返回右表 bbb 的所有记录,以及左表 aaa 中匹配成功的记录。若左表无匹配,则左表字段显示为 NULL。
右连接原理示意:
操作实现
SELECT * FROM aaa RIGHT JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
右连接结果示意:
全外连接(FULL OUTER JOIN)的替代方案
在 MySQL 8.0 中,原生并不直接支持 FULL OUTER JOIN 关键字。但我们可以通过将“左连接”和“右连接”的结果进行 UNION 操作来实现全外连接的效果。这表示返回两个表的所有数据,缺失部分用 NULL 填充。
全连接原理示意:
操作实现:UNION 模拟全连接
-- 获取左表全部 + 右表匹配 SELECT * FROM aaa LEFT JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E UNION -- 获取右表全部 + 左表匹配(排除已存在的左表交集行) SELECT * FROM aaa RIGHT JOIN bbb ON aaa.C = bbb.C AND aaa.D = bbb.D AND aaa.E = bbb.E;
注意:此处使用 UNION 会自动去重,避免中间交集部分的重复。若数据量极大且允许重复,可考虑 UNION ALL(但在本例逻辑中,UNION 更符合集合论的“并集”定义)。
最终全连接结果示意:
以上就是 MySQL 8.0 连接查询的内连接、外连接及全连接实现的详细内容,更多关于 MySQL 多表查询优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









