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

INNER JOIN(内连接)= 3-20 的 JOIN 正式名——两边都【对上号】的行才留,差一个字号的都不收。

📝 本节和前面几节的关系

3-20 埋的伏笔【钱七为什么出局】在本节正式命名:那叫内连接。写 JOIN 还是 INNER JOIN 是一回事(INNER 可省略);本节把它的脾气、坑和适用场景说透,为 3-22 的外连接立好参照。

一、INNER JOIN 的定义与写法

-- 准备块:students(3-6)+ classes(3-20)

SELECT students.name, students.class, classes.teacher
FROM students
INNER JOIN classes ON students.class = classes.id;

二、内连接的画面感:配对桌

想象两张名单分坐长桌两侧:

内连接的铁律:配对成功才入座,落单的离场——两边都不迁就。

三、内连接的对称性

内连接有个好脾气:A JOIN B 和 B JOIN A 结果内容相同(列的摆放顺序不同而已)——谁左谁右不改变【只留配对成功】的规矩。

外连接(3-22)恰好相反:谁在左谁在右天差地别——这是两族连接最大的性格差异。

四、动手 Demo:内连接三连

-- ① 基础配对:学生×班主任(4 行,钱七出局)
SELECT students.name, classes.teacher
FROM students
INNER JOIN classes ON students.class = classes.id;

-- ② 配对+聚合:每个老师带几个人
SELECT classes.teacher, COUNT(*) AS 带生数
FROM students
INNER JOIN classes ON students.class = classes.id
GROUP BY classes.teacher;

-- ③ 三表拼:给 students 造一张课程表再拼(体会多表链)
CREATE TABLE courses (
  class INTEGER,
  course TEXT
);
INSERT INTO courses VALUES (1, '语文');
INSERT INTO courses VALUES (1, '数学');
INSERT INTO courses VALUES (2, '英语');

SELECT students.name, classes.teacher, courses.course
FROM students
INNER JOIN classes ON students.class = classes.id
INNER JOIN courses ON courses.class = students.class;

③的输出:张三/李四各对应【语文、数学】两行,王五/赵六各对应【英语】一行——一个学生的信息拆成多行出现(1 对多),行数变多不是错,是配对的天然结果。

看到什么算成功:①4 行、②两行、③能解释【为什么张三出现了两行】。

五、30 秒实验

给 classes 补上 3 班:INSERT INTO classes VALUES (3, '钱老师'); 再跑①——钱七回来了(5 行)。内连接不丢人,丢的是【对不上号】;数据补齐,配对自然成功。这正是排查【JOIN 少数据】的第一动作:检查另一边到底有没有对得上号的那行。

六、常见误区

  1. "JOIN 和 INNER JOIN 是两种连接" —— 同一个:JOIN 是省略 INNER 的简写。
  2. "配对失败的行会以 NULL 出现" —— 那是外连接(3-22);内连接里落单的行直接消失,不是补 NULL。
  3. "内连接丢行是 bug" —— 是设计:只要【确定两边都该有】的数据(订单对商品、订单对顾客),内连接恰好滤掉脏数据;【想保全一方】才轮到外连接。
自测三问(点开对答案) 1. `JOIN` 和 `INNER JOIN` 什么关系? **同一个,INNER 可省略**。 2. 内连接怎么处理配对失败的行? **直接出局**——不补 NULL(那是外连接)。 3. A INNER JOIN B 和 B INNER JOIN A 结果一样吗? **内容一样**(列顺序不同)——内连接对称;外连接不对称。

相关笔记