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

相关推荐
考虑考虑4 小时前
数据库中的EXISTS
运维·数据库·后端
Wang's Blog5 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
梦想平凡6 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
xcLeigh6 小时前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
yume_sibai7 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
AugustRed8 小时前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j
Gl�ria8 小时前
Redis 高可用架构对比
数据库·redis
IpdataCloud9 小时前
高可用的IP数据接口平台有哪些?从可用性、P99延迟到离线部署的评估框架(含代码)
数据库·tcp/ip·ip
呆萌很9 小时前
MySQL 数据库和表的管理操作(命令行)
数据库·mysql
IvorySQL10 小时前
当PostgreSQL“听懂”MySQL——协议兼容层的设计与实战
数据库·人工智能·postgresql