MySQL连接类型区别详解

在 MySQL 中,LEFT JOINRIGHT JOIN 和 INNER JOIN 是关联多个表的核心方式,核心区别在于它们如何处理连接条件未匹配的行。下面用图示和表格对比说明:

📊 核心区别总结

连接类型别名保留哪侧数据未匹配行的处理使用频率
INNER JOIN JOIN (默认) 仅双方匹配的行 丢弃所有未匹配行 ⭐⭐⭐⭐⭐
LEFT JOIN LEFT OUTER JOIN 左表所有行 + 右表匹配行 右表未匹配列补 NULL ⭐⭐⭐⭐
RIGHT JOIN RIGHT OUTER JOIN 右表所有行 + 左表匹配行 左表未匹配列补 NULL

🧩 详细说明(以表A和表B为例)

1. INNER JOIN (内连接)

  • 结果集: 仅返回 表A和表B匹配成功 的行。

  • 未匹配数据: 直接丢弃。

  • 语法示例:

    sql
    SELECT * 
    FROM tableA A
    INNER JOIN tableB B ON A.key = B.key;
  • 图示:

    text
     表A         表B         结果
    ┌───┐      ┌───┐      ┌───────┐
    │ A1├─匹配─┤B1 │  →   │ A1-B1 │
    │ A2│      └───┘      └───────┘
    └───┘                       

2. LEFT JOIN (左外连接)

  • 结果集: 返回 表A所有行 + 表B匹配的行。

  • 未匹配数据: 表B列补 NULL

  • 语法示例:

    sql
    SELECT * 
    FROM tableA A
    LEFT JOIN tableB B ON A.key = B.key;
  • 图示:

    text
     表A         表B         结果
    ┌───┐      ┌───┐      ┌──────────┐
    │ A1├─匹配─┤B1 │  →   │ A1-B1    │
    │ A2│      └───┘      │ A2-NULL  │
    └───┘                 └──────────┘

3. RIGHT JOIN (右外连接)

  • 结果集: 返回 表B所有行 + 表A匹配的行。

  • 未匹配数据: 表A列补 NULL

  • 语法示例:

    sql
    SELECT * 
    FROM tableA A
    RIGHT JOIN tableB B ON A.key = B.key;
  • 图示:

    text
     表A         表B         结果
    ┌───┐      ┌───┐      ┌──────────┐
    │ A1│      │B1 │  →   │ A1-B1    │
    └───┘      │B2 │      │ NULL-B2  │
               └───┘      └──────────┘

💡 关键注意事项

  1. LEFT JOIN vs RIGHT JOIN
    两者本质对称,实际开发中优先使用 LEFT JOIN(更符合从左到右的阅读习惯)。需 RIGHT JOIN 时,通常可通过调换表顺序 + LEFT JOIN 实现。

  2. 过滤条件的放置

    • ON 子句: 定义连接条件(影响连接行为)。

    • WHERE 子句: 在连接后过滤结果(可能将 NULL 行过滤掉)。

    sql
     
    -- 错误:可能将LEFT JOIN的未匹配行过滤掉
    SELECT * 
    FROM A 
    LEFT JOIN B ON A.id = B.id
    WHERE B.value > 10; 
    
    -- 正确:将条件移至ON子句
    SELECT * 
    FROM A 
    LEFT JOIN B ON A.id = B.id AND B.value > 10;
  3. 性能考虑

    • INNER JOIN 通常最快(数据量最小)。

    • LEFT/RIGHT JOIN 需处理未匹配行,可能稍慢。确保关联字段有索引可优化性能。


🌰 实际场景示例

假设有两个表:

  • employees 表 (员工信息)

  • departments 表 (部门信息)

sql
 
复制
 
下载
-- 查所有员工及其部门(包括未分配部门的员工)
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;

-- 查所有部门及其员工(包括无员工的部门)
SELECT d.dept_name, e.name
FROM departments d
LEFT JOIN employees e ON d.id = e.dept_id;  -- 等价于 RIGHT JOIN 写法

-- 仅查已分配部门的员工信息
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;

✅ 总结:根据业务需求选择连接类型——需保留主表完整数据时用 LEFT JOIN/RIGHT JOIN,只需交集数据则用 INNER JOIN。理解差异后,多表关联将更得心应手!

posted @ 2025-07-14 19:29  不忘初心-Jerome  阅读(16)  评论(0)    收藏  举报