news 2026/4/18 10:29:36

left join、right join和join,傻傻分不清?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
left join、right join和join,傻傻分不清?

一、核心思想:用“文氏图”和“表格视角”一次性讲清

所有的 JOIN 操作,都可以从两个维度理解:集合论维度(文氏图)表格操作维度。前者帮你建立直觉,后者教你实际使用。

1. 集合论视角(你想建立的理解)

想象两个圆圈:

  • A表:比如员工表

  • B表:比如部门表

它们重叠的部分,就是关联字段能匹配上的记录(比如员工都有明确的部门ID)。

JOIN 类型文氏图白话解释
INNER JOIN(即JOIN)https://sql-joins.leopard.in.ua/inner-join.png只取交集。只返回两个表能匹配上的记录。没部门的员工和没员工的部门,都不出现。
LEFT JOIN(左连接)https://sql-joins.leopard.in.ua/left-join.png保左全,联右部左表(A)的全部记录一定保留,右表(B)只显示能匹配上的部分。匹配不上的,右表字段用NULL填充。
RIGHT JOIN(右连接)https://sql-joins.leopard.in.ua/right-join.png保右全,联左部右表(B)的全部记录一定保留,左表(A)只显示能匹配上的部分。匹配不上的,左表字段用NULL填充。
FULL OUTER JOIN(全外连接)https://sql-joins.leopard.in.ua/full-outer-join.png两边全要。左右两表的全部记录都保留,能匹配的匹配,匹配不上的用NULL补充。

2. 表格操作视角(你写代码时的画面)

这才是你写 SQL 时应该想象的!假设我们有:

  • 员工表(employees:

emp_idemp_namedept_id
1张三101
2李四102
3王五NULL
  • 部门表(departments:

dept_iddept_name
101技术部
102市场部
103行政部

二、逐一分辨:语法、结果与场景

1. INNER JOIN(内连接) - 最常用的JOIN
  • 口语叫法:“JOIN” 或 “INNER JOIN”,两者完全等同。

  • 核心逻辑求交集。只关心两表有明确关联的数据。

  • 语法

    sql

    SELECT ... FROM 表A A [INNER] JOIN 表B B ON A.key = B.key; -- `INNER` 关键字可省略
  • 我们的例子

    sql

    SELECT e.emp_name, d.dept_name FROM employees e JOIN departments d ON e.dept_id = d.dept_id;
  • 结果

    emp_namedept_name
    张三技术部
    李四市场部
    (王五的dept_idNULL,匹配不上;行政部没有对应的员工,所以都不出现)
  • 何时使用?

    • 绝大多数业务查询:当你只想获取有完整关联信息的数据时。例如,“查询所有已分配部门的员工及其部门信息”。

2. LEFT JOIN(左连接) - 保底查询神器
  • 口语叫法:“左连接”或“左外连接”(LEFT OUTER JOINOUTER可省略)。

  • 核心逻辑以左表为基准。左表是“主子”,记录一条不少;右表是“跟班”,有信息就贴上,没有就用NULL补位。

  • 语法

    sql

    SELECT ... FROM 表A A LEFT [OUTER] JOIN 表B B ON A.key = B.key;
  • 我们的例子

    sql

    SELECT e.emp_name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.dept_id;
  • 结果

    emp_namedept_name
    张三技术部
    李四市场部
    王五NULL
    左表员工全在,王五没部门,所以部门为NULL
  • 何时使用?

    • 查找“缺失”:“查询所有未分配部门的员工”(WHERE d.dept_id IS NULL)。

    • 主从报表:以主表(如订单)为核心,关联子表(如用户、商品),即使子表信息缺失也要展示主表记录。

    • 最常用:因为它明确指定了主查询表,逻辑清晰。LEFT JOIN的使用频率远高于RIGHT JOIN

3. RIGHT JOIN(右连接) - 不常用的左连接镜像
  • 口语叫法:“右连接”或“右外连接”。

  • 核心逻辑以右表为基准。右表是“主子”,左表是“跟班”。它本质上就是LEFT JOIN的反向操作

  • 语法

    sql

    SELECT ... FROM 表A A RIGHT [OUTER] JOIN 表B B ON A.key = B.key;
  • 我们的例子

    sql

    SELECT e.emp_name, d.dept_name FROM employees e RIGHT JOIN departments d ON e.dept_id = d.dept_id;
  • 结果

    emp_namedept_name
    张三技术部
    李四市场部
    NULL行政部
    右表部门全在,行政部没员工,所以员工名为NULL
  • 关键认知
    A RIGHT JOIN B完全等同于B LEFT JOIN A
    上面的例子等价于:

    sql

    SELECT e.emp_name, d.dept_name FROM departments d -- 部门表变成了左表 LEFT JOIN employees e ON d.dept_id = e.dept_id; -- 员工表变成了右表
  • 何时使用?

    • 极少。因为人们习惯从左向右阅读,将主表放在FROM后,用LEFT JOIN关联其他表更符合思维习惯。刻意使用RIGHT JOIN会让SQL可读性变差。


三、终极记忆心法与总结

1. 一张图总结关系
下图完美诠释了所有 JOIN 类型的数据流向(请将此图刻在脑海里):
https://i.stack.imgur.com/UI25E.jpg

2. 三步选择法(面对问题时的思考路径)
定主表:我这次查询,必须以哪个表的记录为绝对核心?—— 把它放在FROM后。
明需求
- 只要两表都有的数据? -> 用INNER JOIN
- 主表记录必须全部保留,关联信息有的就带上? -> 用LEFT JOIN
- (罕见情况)确实需要以第二个关联表为绝对核心? -> 可以考虑RIGHT JOIN,但不如把主表换到FROM后用LEFT JOIN
查缺失:如果想找主表里在关联表中没有对应项的记录,就在LEFT JOIN后加WHERE 关联表.key IS NULL

3. 核心要点表格

特性INNER JOINLEFT JOINRIGHT JOIN
别名JOINLEFT OUTER JOINRIGHT OUTER JOIN
核心表无(对称)左表是核心右表是核心
结果倾向两表交集左表全集+ 右表匹配右表全集+ 左表匹配
匹配失败时丢弃该行保留左表行,右表填NULL保留右表行,左表填NULL
使用频率⭐⭐⭐⭐⭐⭐⭐⭐⭐
可替代性不可替代A LEFT JOIN B可用B RIGHT JOIN A替代总可用LEFT JOIN重写

四、一句话分清楚

  • JOIN(INNER JOIN):“只给我看你们俩都有的部分。”

  • LEFT JOIN:“把左边人的名单全给我,右边的人能配上就对号入座,配不上就空着。”

  • RIGHT JOIN:“把右边人的名单全给我……”(但你可以永远用LEFT JOIN来实现它,所以忘了它吧!)

最终建议:熟练掌握INNER JOINLEFT JOIN,足以应对99%的场景。将RIGHT JOIN理解为一种语法糖,看到别人用时知道什么意思即可,自己写SQL时,优先使用LEFT JOIN

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:26:40

RetinaFace在C语言项目中的集成:跨语言调用实战

RetinaFace在C语言项目中的集成:跨语言调用实战 1. 为什么要在C项目里用RetinaFace 你可能已经用Python跑过RetinaFace,效果确实不错——能框出人脸,还能标出眼睛、鼻子、嘴巴这五个关键点。但当项目要上嵌入式设备、做系统级服务&#xff…

作者头像 李华
网站建设 2026/4/18 2:26:02

ChatGLM-6B法律领域实践:合同条款解释助手开发记录

ChatGLM-6B法律领域实践:合同条款解释助手开发记录 1. 为什么选ChatGLM-6B做法律助手? 你有没有遇到过这样的场景:手头一份几十页的采购合同,密密麻麻全是“不可抗力”“违约责任”“管辖法院”这类术语,逐条查法条太…

作者头像 李华
网站建设 2026/4/18 3:57:46

Face3D.ai ProGPU算力适配:A10/A100/V100显卡下Mesh Resolution极限测试

Face3D.ai ProGPU算力适配:A10/A100/V100显卡下Mesh Resolution极限测试 1. Face3D.ai Pro 是什么?——不是玩具,是工业级3D人脸重建工作台 你有没有试过,只用一张手机自拍,就生成能直接导入Blender做动画的3D人脸模…

作者头像 李华