LeetCode SQL 从入门到精通(MySQL)05(下)

LEFT JOIN 与自连接,一篇彻底搞懂!

上一篇我们学习了 INNER JOIN 和 ON 的使用方法。本篇继续学习 JOIN 中最重要的两个知识点:

  • LEFT JOIN

  • Self Join(自连接)

这两类 JOIN 几乎覆盖了 LeetCode SQL 中绝大多数连接类题目。


一、为什么需要 LEFT JOIN?

INNER JOIN 的特点是:

只有两张表能够匹配的数据才会返回。

例如:

Person

personId name
1 Allen
2 Bob

Address

personId city
2 New York

如果执行:

复制代码
SELECT *
FROM Person p
JOIN Address a
ON p.personId = a.personId;

结果:

name city
Bob New York

Allen 消失了。

为什么?

因为 Address 中没有 personId=1。


二、LEFT JOIN 的作用

LEFT JOIN 表示:

保留左表所有数据。

语法:

复制代码
SELECT ...
FROM A
LEFT JOIN B
ON ...

执行逻辑:

  1. 先保留 A 的所有记录。

  2. 去 B 中寻找对应记录。

  3. 找到则拼接。

  4. 找不到则填充 NULL。

例如:

复制代码
SELECT
    p.firstName,
    p.lastName,
    a.city,
    a.state
FROM Person p
LEFT JOIN Address a
ON p.personId = a.personId;

结果:

firstName city
Allen NULL
Bob New York

这正是 LeetCode 175《Combine Two Tables》的标准解法。


三、LEFT JOIN 与 INNER JOIN 的区别

INNER JOIN:

复制代码
Person      Address

Allen   ×   没有地址
Bob     √   New York

返回:

复制代码
Bob

LEFT JOIN:

复制代码
Person      Address

Allen   ×
↓
Allen NULL

Bob     √
↓
Bob New York

返回:

复制代码
Allen
Bob

因此可以记一句口诀:

LEFT JOIN 保留左边。


四、什么时候一定要用 LEFT JOIN?

当题目出现下面这些描述时:

  • 所有用户

  • 所有员工

  • 所有订单

  • 即使没有......

  • 如果不存在......

几乎都应该首先想到 LEFT JOIN。

例如:

显示所有员工及其奖金。

没有奖金也要显示员工。

那么:

复制代码
Employee
LEFT JOIN Bonus

五、自连接(Self Join)

什么是自连接?

就是:

一张表和自己连接。

例如员工表:

id name managerId
1 Alice NULL
2 Bob 1
3 Tom 1

managerId 指向的也是 Employee 表。

因此需要:

复制代码
SELECT
    e.name AS Employee,
    m.name AS Manager
FROM Employee e
LEFT JOIN Employee m
ON e.managerId = m.id;

结果:

Employee Manager
Alice NULL
Bob Alice
Tom Alice

这里:

  • e 表示员工

  • m 表示经理

其实都是 Employee。


六、为什么要起别名?

如果写:

复制代码
FROM Employee
JOIN Employee

数据库不知道:

哪一个 Employee 是员工。

哪一个 Employee 是经理。

所以必须:

复制代码
Employee e
Employee m

这样:

复制代码
e.id
m.id

就能区分。


七、LeetCode 高频题

① 175 Combine Two Tables

考点:

LEFT JOIN。

② 181 Employees Earning More Than Their Managers

考点:

自连接。

复制代码
SELECT e.name
FROM Employee e
JOIN Employee m
ON e.managerId = m.id
WHERE e.salary > m.salary;

③ 查询每个员工及其经理

也是自连接。


八、常见错误

错误一

需要保留全部用户,却写成:

复制代码
JOIN

正确:

复制代码
LEFT JOIN

错误二

ON 条件写错。

例如:

复制代码
ON id=id

应该:

复制代码
ON e.managerId=m.id

错误三

忘记起别名。

自连接必须使用:

复制代码
Employee e
Employee m

九、本章总结

今天学习了两个核心知识:

  1. LEFT JOIN:保留左表所有数据,匹配不到返回 NULL。

  2. Self Join:一张表连接自己,用于处理上下级、父子节点、好友关系等问题。

牢记一句口诀:

保留谁,就把谁放在 LEFT JOIN 左边。

下一篇,我们将正式进入 SQL 中非常重要的一类知识------子查询(Subquery)。

相关推荐
Elastic 中国社区官方博客13 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
红海云13 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba13 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭14 小时前
达梦事物特性及MVCC
linux·运维·数据库
小马同学-14 小时前
MySQL主从复制和读写分离
数据库·mysql
谢亮_vipxieliang14 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
geovindu15 小时前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠15 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
EatFan16 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长16 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统