MySQL 8.0 连接查询详解:内连接、左/右外连接及全连接实现

晚来风
晚来风
发布时间:2026-10-16| 9人浏览过
原创

本文详解 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 多表查询优化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。