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)。

相关推荐
毛驴赶鹿5 小时前
【金仓数据库征文】KES V9性能调优实战记录:从慢SQL排查到全链路优化
数据库·sql
码农阿豪5 小时前
【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
数据库·macos·docker
杨云龙UP5 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
ZENERGY-众壹6 小时前
500个工商业电站压垮数据库?海量光伏时序数据存储的架构取舍
数据库·架构·influxdb·光伏·光伏运维
mubei-1237 小时前
SpringDAO的用法
java·开发语言·数据库
星蓝_starblue9 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三84411 小时前
sqli-labs1-10通关笔记
数据库
BullSmall13 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存
SelectDB13 小时前
Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍
数据库
码农颜13 小时前
5.1.1 原⼦性
数据库·mysql