为什么说“内连接”和“外连接”是表连接的两大基本类型,而“左连接”、“右连接”、“全连接”是外连接的子类?
“内连接”和“外连接”是表连接的两大基本类型,而**“左连接”、“右连接”、“全连接”是外连接的子类**,这种分类是基于 SQL连接操作的“结果集构成逻辑”和“表间关系保留方向” 的严格定义。
一、为什么是两大基本类型?
这两大类型是根据 “连接结果集中包含哪些行”的根本逻辑 来划分的,它们代表了两种截然不同的数据关联哲学。
| 基本类型 | 核心逻辑 | 结果集构成 | 数学类比 |
|---|---|---|---|
| 内连接 (INNER JOIN) | “匹配则留,不匹配则弃” | 只返回两个表中都与连接条件匹配的行。
| 集合的交集 (Intersection) |
| 外连接 (OUTER JOIN) | “以一方为主,匹配则关联,不匹配则补空” | 返回一个表(或两个表)的所有行,并根据条件尝试关联另一个表,无匹配则用
| 集合的扩展 (Extended Union) |
“SQL 提供的链接查询分为内连接(Inner Join)和外连接(Outer Join)两大类型。”
“内连接只返回两个表中与连接谓词匹配的行,不匹配的行不会被输出。”
“外连接可以将左表或右表中不匹配的行输出。”
这是最顶层的分类,因为任何连接操作,其结果要么是“只要匹配的”(内连接),要么是“即使不匹配也要保留一部分的”(外连接),没有第三种根本逻辑。
二、为什么“左/右/全连接”是外连接的子类?
因为“左连接”、“右连接”、“全连接”是 外连接这一基本类型下,根据“具体要保留哪个表的所有行”这一不同策略 进一步细分的。它们共享“保留不匹配行”的外连接核心逻辑,但在保留方向上有所不同。
可以将它们理解为外连接的三种具体“模式”或“策略”:
| 外连接子类 | 核心策略 | 保留方向 | 结果集构成 | 文档示例与说明 |
|---|---|---|---|---|
| 左外连接 (LEFT OUTER JOIN) | “左表为主,右表为辅” | 保留左表全部行。 | 左表所有行 + 匹配的右表行(无匹配则右表列补
| “左外连接:结果集取左表中全部的行,如右表中没有符合条件的对应则填充null。”
|
| 右外连接 (RIGHT OUTER JOIN) | “右表为主,左表为辅” | 保留右表全部行。 | 右表所有行 + 匹配的左表行(无匹配则左表列补
| “右外连接:结果集取右表中全部的行,如左表中没有符合条件的对应则填充null。”
|
| 全外连接 (FULL OUTER JOIN) | “两者皆为主,一个都不能少” | 保留左表和右表的全部行。 | 左表所有行 ∪ 右表所有行(匹配的关联,不匹配的各自补
| “全连接:结果集取两张表中全部的行,如没有符合条件的对应项则填充null。”
|
总结:
两大基本类型(内/外) 的划分依据是 “结果集是否包含不匹配的行”,这是连接操作最根本的二分法。
外连接的三个子类(左/右/全) 的划分依据是 “具体要保留哪个表的不匹配行”,它们是对外连接这一基本类型在不同应用场景下的具体实现。
理解这种层次关系对于正确编写和理解SQL连接查询至关重要:
当你说“使用外连接”时,你必须进一步明确是左、右还是全外连接。
而“内连接”本身就是一个明确的、无需再细分的操作。
这种分类体系是SQL标准的一部分,被所有主流关系型数据库(包括GBase 8a)所遵循。
评论
热门帖子
- 12025-12-01浏览数:182055
- 22023-05-09浏览数:24283
- 42023-09-25浏览数:17497
- 52020-05-11浏览数:16503