🗄️ 第三章 操作数据库-SQL的使用方法
📄 一句话概括

外连接 = 以一方为准,配不上也保留(另一边补 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>   ← 留下来了!

画面感:内连接是【配对成功才入座】;外连接是【以左桌为名册点名】——每个人都要念到,没配对的旁边空椅(NULL)。

二、配对之外的归属感:谁在左谁在右

写法 全保谁 落单行
A LEFT JOIN B A 全保 B 侧补 NULL
A RIGHT JOIN B B 全保 A 侧补 NULL

三、外连接的本职:查漏

【哪些学生还没配上班主任?】——外连接+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 换个方向,查漏方向跟着换。运营后台的【滞销商品】【无主订单】都是这么抓的。

六、常见误区

  1. "LEFT JOIN 结果一定比内连接多" —— 行数 ≥ 内连接(配不上的带 NULL 留下),但【多出来】是 NULL 行不是重复数据;别看到行数变多以为是错。
  2. "RIGHT JOIN 是必须学的另一套" —— 本质同 LEFT:把两张表在 FROM/JOIN 位置对调,RIGHT 就变 LEFT。会 LEFT +会换位=会 RIGHT(SQLite 老版本甚至只支持 LEFT)。
  3. "补 NULL 说明数据坏了" —— NULL 是外连接的【占位提醒】:【这边没有对应】。它不是错误,是线索——顺着它去查漏。
自测三问(点开对答案) 1. LEFT JOIN 和内连接的行为差异? **左表全保,配不上的右列补 NULL;内连接则直接丢行**。 2. 【找出没有班主任的学生】怎么写? **LEFT JOIN + `WHERE 右表主键 IS NULL`**。 3. LEFT/RIGHT 可以互相转换吗? **可以——两张表在 FROM/JOIN 位置对调即可**;LEFT 为主,RIGHT 少用。

相关笔记