内连接、左连接、右连接有什么区别?

admin 6733 2026-06-20 07:15:34

理解内连接、左连接和右连接的区别是掌握 SQL 查询的核心。它们主要决定了当两个表基于某个关联条件连接时,哪些行会被包含在结果集中。

现在我们有2个表:

员工表 (Employees)

idnamedepartment_id1张三12李四13王五24赵六35钱七NULL部门表 (Departments)

iddepartment_name1技术部2市场部4财务部

关联条件: Employees.department_id = Departments.id

1. 内连接 (INNER JOIN)核心思想: 只返回两个表中连接条件完全匹配的行。它是交集。

结果集包含:

员工表中有部门ID (department_id 非空) 且

该部门ID在部门表中存在 (id 匹配)。

结果示例 (基于我们的表):

idnamedepartment_iddepartment_name1张三1技术部2李四1技术部3王五2市场部

谁被排除了?

赵六 (department_id=3,但部门表中没有 id=3 的部门) - 右表无匹配

钱七 (department_id=NULL,无法匹配任何部门ID) - 左表条件无效

财务部 (id=4,但没有员工 department_id=4) - 左表无匹配

SELECT Employees.id, Employees.name, Employees.department_id,

Departments.department_nameFROM Employees

INNER JOIN Departments ON Employees.department_id = Departments.id;2. 左连接 (LEFT JOIN 或 LEFT OUTER JOIN)核心思想: 返回左表 (FROM子句后的表) 的所有行,即使在右表 (JOIN子句后的表) 中没有匹配的行。对于右表无匹配的行,结果集中右表的所有列将显示为 NULL。

结果集包含:

所有左表 (员工表) 的行。

如果员工在部门表中有匹配的部门,则显示部门信息。

如果员工在部门表中没有匹配的部门(department_id 在部门表中找不到对应 id 或 department_id 是 NULL),则部门信息列显示为 NULL。

结果示例 (基于我们的表):

idnamedepartment_iddepartment_name1张三1技术部2李四1技术部3王五2市场部4赵六3NULL<-- 部门ID 3 在部门表中不存在5钱七NULLNULL<-- 没有部门ID,无法匹配谁被排除了?

财务部 (id=4,但没有员工 department_id=4) - 右表行在左表无匹配

SELECT Employees.id, Employees.name, Employees.department_id,

Departments.department_name

FROM Employees

LEFT JOIN Departments ON Employees.department_id = Departments.id;3. 右连接 (RIGHT JOIN 或 RIGHT OUTER JOIN)核心思想: 返回右表 (JOIN子句后的表) 的所有行,即使在左表 (FROM子句后的表) 中没有匹配的行。对于左表无匹配的行,结果集中左表的所有列将显示为 NULL。

结果集包含:

所有右表 (部门表) 的行。

如果部门在员工表中有匹配的员工(有员工的 department_id 等于该部门的 id),则显示员工信息。

如果部门在员工表中没有匹配的员工(没有员工的 department_id 等于该部门的 id),则员工信息列显示为 NULL。

结果示例 (基于我们的表):

idnamedepartment_iddepartment_name1张三1技术部2李四1技术部3王五2市场部NULLNULLNULL财务部<-- 部门ID 4 没有对应的员工谁被排除了?

赵六 (department_id=3,但部门表中没有 id=3 的部门) - 左表行在右表无匹配

钱七 (department_id=NULL,无法匹配任何部门ID) - 左表行在右表无匹配

SELECT Employees.id, Employees.name, Employees.department_id,

Departments.department_name

FROM Employees

RIGHT JOIN Departments ON Employees.department_id = Departments.id;关键区别总结表特性内连接 (INNER JOIN)左连接 (LEFT JOIN)右连接 (RIGHT JOIN)核心原则只返回匹配行返回左表所有行 + 匹配的右表行返回右表所有行 + 匹配的左表行结果集来源两表的交集左表全集 + 匹配的右表子集右表全集 + 匹配的左表子集未匹配处理双方不匹配的行都不包含左表未匹配行保留,右表列置为 NULL右表未匹配行保留,左表列置为 NULL使用频率非常高非常高相对较少 (可用左连接替代)类似概念交集左表全集右表全集简单记忆INNER JOIN: “两边都要有”(严格匹配)。

LEFT JOIN: “左边全要,右边有的就给,没有就给空”。

RIGHT JOIN: “右边全要,左边有的就给,没有就给空”(实践中通常用 LEFT JOIN 调换表顺序来实现,避免使用 RIGHT JOIN 使查询逻辑更清晰)。

上一篇
下一篇
相关文章