Page 1 of 1

INNER JOIN 和 OUTER JOIN 有什么区别?

Posted: Tue May 20, 2025 6:30 am
by suhashini25
在 SQL 中,INNER JOIN 和 OUTER JOIN 是两种最基本和最常用的连接(JOIN)类型,用于组合来自两个或多个表的数据。它们之间的核心区别在于如何处理那些在连接条件中没有匹配的行。

1. INNER JOIN(内连接)
核心思想: INNER JOIN 只返回在两个(或多个)表中都存在匹配行的记录。它只包含那些在 JOIN 条件中满足匹配的行。

语义: 类似于数学中的集合交集。只有当连接条件在两个表中都为真时,对应的行才会被包含在结果集中。

解释:

Alice 和 Bob 的记录被包含进来,因为他们在 Students 表和 Courses_Taken 表中都有匹配的 StudentID。
Carol 没有在 Courses_Taken 表中找到匹配的 StudentID,所以她的记录被排除。
EnrollmentID 104 (StudentID 4) 在 Students 表中没有匹配,所以它的记录也被排除。
2. OUTER JOIN(外连接)
OUTER JOIN 与 INNER JOIN 的主要区别在于,即使在连接条件中没有匹配的行,它也会保留一个或两个表中的所有行,并在没有匹配的地方用 NULL 填充。OUTER JOIN 又细分为三种类型:

2.1. LEFT JOIN / LEFT OUTER JOIN(左连接 / 左外连接)
核心思想: 返回左表(FROM 子句中在 LEFT JOIN 关键字左边的表)的所有行,以及右表中与左表匹配的行。如果右表中没有匹配项,则右表的列将显示为 NULL。


Alice 和 Bob 的记录及其课程被包含进来。
Carol 没有选课,但在 Students 表中存在,所以 印度尼西亚赌博数据 她的记录仍然被包含,而 CourseName 显示为 NULL。
EnrollmentID 104 (StudentID 4) 在 Students 表中没有匹配,所以它的记录被排除(因为它不是左表的一部分)。
2.2. RIGHT JOIN / RIGHT OUTER JOIN(右连接 / 右外连接)
核心思想: 返回右表(FROM 子句中在 RIGHT JOIN 关键字右边的表)的所有行,以及左表中与右表匹配的行。如果左表中没有匹配项,则左表的列将显示为 NULL。

语义: 包含右表的所有内容,以及左表与右表相交的部分。

关键字: RIGHT JOIN 或 RIGHT OUTER JOIN。

示例: 查找所有课程及其对应的学生(即使学生不存在)。

Alice 和 Bob 的课程及其学生被包含进来。
Biology 课程 (EnrollmentID 104) 在 Students 表中没有匹配的 StudentID,但它在 Courses_Taken 表中存在,所以它的记录仍然被包含,而 StudentName 显示为 NULL。
Carol 没有选课,所以她的记录被排除(因为它不是右表的一部分)。
2.3. FULL JOIN / FULL OUTER JOIN(全连接 / 全外连接)
核心思想: 返回左表和右表中的所有行,包括在任一表中没有匹配的行。如果某个表中没有匹配项,则另一个表的列将显示为 NULL。

语义: 类似于数学中的集合并集。它结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

关键字: FULL JOIN 或 FULL OUTER JOIN。

包含了所有匹配的记录(Alice 的课程,Bob 的课程)。
包含了左表中没有匹配的记录(Carol,课程为 NULL)。
包含了右表中没有匹配的记录(Biology 课程,学生为 NULL)。
注意: MySQL 不直接支持 FULL JOIN。但在 MySQL 中可以通过 LEFT JOIN 和 RIGHT JOIN(通过 UNION ALL 联合结果,并处理重复项)来模拟实现 FULL JOIN。

总结区别
特性 INNER JOIN (内连接) OUTER JOIN (外连接)
匹配原则 只返回两个表都匹配的行。 保留一个或两个表中所有行,即使没有匹配。
未匹配行 丢弃未匹配的行。 保留未匹配的行,用 NULL 填充另一表的列。
类型 只有一种 INNER JOIN。 分为 LEFT JOIN、RIGHT JOIN、FULL JOIN 三种。
结果集大小 通常小于或等于 OUTER JOIN。 通常大于或等于 INNER JOIN。
常用场景 获取两个实体间有共同属性的数据。 获取某个实体所有数据,并附带相关联实体的数据(即使不存在)。

Export to Sheets
选择使用 INNER JOIN 还是 OUTER JOIN(以及具体的 OUTER JOIN 类型)取决于你希望在结果集中包含哪些数据:是只关心相互匹配的数据,还是希望包含左表、右表或两边的所有数据,即使没有匹配。