📄 一句话概括
外连接 = 以一方为准,配不上也保留(另一边补 NULL)——LEFT 看重左表、RIGHT 看重右表;【查漏】是它的本职。
📝 本节和前面几节的关系
3-21 内连接把落单的钱七丢了;可业务常常要【全班名单一个不少,班主任没配上的也给我列出来】——这就是外连接。本章最后一块拼图,装上它,2-3 的拆表体系完整闭环。
一、外连接的脾气:以一方为准
-- 准备块:students(3-6)+ classes(3-20)
-- LEFT JOIN:students 全保,配不上的补 NULL
SELECT students.name, students.class, classes.teacher
FROM students
LEFT JOIN classes ON students.class = classes.id;
输出:
name class teacher
张三 1 刘老师
李四 1 刘老师
王五 2 陈老师
赵六 2 陈老师
钱七 3 <NULL> ← 留下来了!
- LEFT JOIN:左表(FROM 那张)一行不少;右表配不上的列填 NULL
- RIGHT JOIN:反过来,右表全保(本例 classes 全对上,结果同内连接)
画面感:内连接是【配对成功才入座】;外连接是【以左桌为名册点名】——每个人都要念到,没配对的旁边空椅(NULL)。
二、配对之外的归属感:谁在左谁在右
| 写法 | 全保谁 | 落单行 |
|---|---|---|
| A LEFT JOIN B | A 全保 | B 侧补 NULL |
| A RIGHT JOIN B | B 全保 | A 侧补 NULL |
- LEFT/RIGHT 的区别只是把哪张表写进 FROM——把 FROM 换位,LEFT 和 RIGHT 可互换,别死记
- 惯例:把【要保全的那张】放 FROM 位置用 LEFT JOIN,读起来顺
三、外连接的本职:查漏
【哪些学生还没配上班主任?】——外连接+IS NULL 组合拳:
SELECT students.name
FROM students
LEFT JOIN classes ON students.class = classes.id
WHERE classes.id IS NULL; -- 右侧没配上(NULL)的行
输出:钱七。【LEFT JOIN + IS NULL】= 找出左表里【没有对应】的行——查漏编册、数据体检的标配手法,背下来。
四、动手 Demo:三种 JOIN 对照
-- ① 内连接:4 行(钱七出局)
SELECT students.name, classes.teacher
FROM students JOIN classes ON students.class = classes.id;
-- ② 左连接:5 行(钱七带 NULL 入场)
SELECT students.name, classes.teacher
FROM students LEFT JOIN classes ON students.class = classes.id;
-- ③ 右连接:本例 classes 全配对,4 行
SELECT students.name, classes.teacher
FROM students RIGHT JOIN classes ON students.class = classes.id;
-- ④ 查漏:没班主任的学生
SELECT students.name
FROM students LEFT JOIN classes ON students.class = classes.id
WHERE classes.id IS NULL;
-- ⑤ 查漏变体:没学生的班(classes 放左边)
SELECT classes.teacher
FROM classes LEFT JOIN students ON students.class = classes.id
WHERE students.id IS NULL; -- 本例无输出(每班都有人);若造个空班就能抓到
看到什么算成功:①4 行/②5 行/③4 行——三种连接的行数差异当场比出来;④抓出钱七。
五、30 秒实验
造一个没学生的空班再查漏:INSERT INTO classes VALUES (3, '钱老师'); 后跑⑤——输出【钱老师】!没人选的班被抓出来了——把 LEFT JOIN 的 FROM 换个方向,查漏方向跟着换。运营后台的【滞销商品】【无主订单】都是这么抓的。
六、常见误区
- "LEFT JOIN 结果一定比内连接多" —— 行数 ≥ 内连接(配不上的带 NULL 留下),但【多出来】是 NULL 行不是重复数据;别看到行数变多以为是错。
- "RIGHT JOIN 是必须学的另一套" —— 本质同 LEFT:把两张表在 FROM/JOIN 位置对调,RIGHT 就变 LEFT。会 LEFT +会换位=会 RIGHT(SQLite 老版本甚至只支持 LEFT)。
- "补 NULL 说明数据坏了" —— NULL 是外连接的【占位提醒】:【这边没有对应】。它不是错误,是线索——顺着它去查漏。
自测三问(点开对答案)
1. LEFT JOIN 和内连接的行为差异? **左表全保,配不上的右列补 NULL;内连接则直接丢行**。 2. 【找出没有班主任的学生】怎么写? **LEFT JOIN + `WHERE 右表主键 IS NULL`**。 3. LEFT/RIGHT 可以互相转换吗? **可以——两张表在 FROM/JOIN 位置对调即可**;LEFT 为主,RIGHT 少用。- ☑ 第四章 管理数据-避免非法数据的功能 —— 已完结:死锁(类型→约束→主外键→事务,两路防线全立住)
相关笔记
- 内连接、INNER JOIN-获取与值匹配的记录 —— 上一节:内连接丢行,本节以 NULL 收留落单者
- 数据类型-指定可保存的数据类型 —— 下一章起点:建表时类型怎么选
- 死锁-两个处理发生冲突导致处理停止的问题 —— 下一章收尾:事务的代价
- 表连接-将各种表组合在一起 —— 拆表体系在本章末完整闭环
- 🗄️ 数据库基础 · 索引 —— 全课路线图