首页 >> 基础教程

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

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

       现在我们有2个表:

员工表 (Employees)

idnamedepartment_id
1
张三1
2李四1
3王五2
4赵六3
5钱七NULL

部门表 (Departments)

iddepartment_name
1技术部
2市场部
4财务部

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

1. 内连接 (INNER JOIN)

  • 核心思想: 只返回两个表中连接条件完全匹配的行。它是交集

  • 结果集包含:

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

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

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

idnamedepartment_iddepartment_name
1张三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_name
    1张三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_name
    1张三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 使查询逻辑更清晰)。


最新文章
InnoDB 和 MyISAM 主要有什么区别?2025-07-06
mysql存储引擎应该怎么选择?2025-07-06
mysql的几种存储引擎2025-07-06
MySQL 的段区页行2025-07-06
一条更新语句是如何执行的?2025-07-06
mysql中一条查询语句是如何执行的?2025-07-02
MySQL基础架构及执行流程解析2025-07-02
MySQL SQL语法树解析过程详解2025-07-02
mysql中SQL 的隐式数据类型转换?2025-07-01
MySQL 第 3-10 条记录怎么查?2025-06-30
备案号:蜀ICP备2023042032号-1