Skip to main content

案例:连接查询

太好了,这个点非常适合做成“一道完整训练题”,我给你设计一题标准教学型连接查询练习: 👉 表结构简单 👉 数据有“刻意不匹配”的情况 👉 能一次性把 INNER / LEFT / RIGHT JOIN 全部讲清楚

你可以直接当 课堂练习题 / 实训题 / 上机考试题 用。


连接查询综合训练题(初学者版)

一、业务场景(先给学生讲故事)

学校里有 学生表成绩表

  • 有的学生 还没有成绩
  • 有的成绩 对应的学生不存在(脏数据)

👉 现在我们要练习不同连接方式的查询效果。


二、建表(题目给定)

1️⃣ 学生表 student

CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(20),
class_name VARCHAR(20)
);

2️⃣ 成绩表 score

CREATE TABLE score (
id INT PRIMARY KEY,
student_id INT,
subject VARCHAR(20),
score INT
);

三、填充测试数据(重点)

1️⃣ 学生表数据

INSERT INTO student VALUES
(1, '张三', '一班'),
(2, '李四', '一班'),
(3, '王五', '二班');

2️⃣ 成绩表数据

INSERT INTO score VALUES
(1, 1, '数学', 90),
(2, 1, '英语', 85),
(3, 2, '数学', 88),
(4, 4, '数学', 92); -- 注意:student_id = 4,在学生表中不存在

📌 老师提示学生注意:

  • student_id = 3 的学生 没有成绩
  • student_id = 4 的成绩 没有学生

这正是 JOIN 的价值所在。


四、训练任务(学生要完成的部分)


任务一:INNER JOIN(只查“完全匹配”的)

要求: 查询 有成绩的学生姓名、班级、科目、成绩

SELECT
s.name,
s.class_name,
c.subject,
c.score
FROM student s
INNER JOIN score c
ON s.id = c.student_id;

📌 预期结果特点:

  • 不显示 王五(没成绩)
  • 不显示 student_id = 4 的那条成绩

任务二:LEFT JOIN(学生为主)

要求: 查询 所有学生 及其成绩(没有成绩的也要显示)

SELECT
s.name,
s.class_name,
c.subject,
c.score
FROM student s
LEFT JOIN score c
ON s.id = c.student_id;

📌 预期结果特点:

  • 所有学生都会显示
  • 王五的成绩为 NULL
  • 成绩表中 student_id = 4 不显示

任务三:RIGHT JOIN(成绩为主)

要求: 查询 所有成绩,即使该成绩没有对应学生

SELECT
s.name,
s.class_name,
c.subject,
c.score
FROM student s
RIGHT JOIN score c
ON s.id = c.student_id;

📌 预期结果特点:

  • 显示所有成绩

  • student_id = 4 那条记录中:

    • nameclass_name 为 NULL

五、对比总结(给学生画表)

JOIN 类型以谁为主不匹配的数据
INNER JOIN两边都要匹配都不显示
LEFT JOIN左表右表不匹配 → NULL
RIGHT JOIN右表左表不匹配 → NULL

一句记忆法:

LEFT JOIN:左表全要 RIGHT JOIN:右表全要 INNER JOIN:只要“有对象的”


六、加分思考题(可选)

1️⃣ 查询 没有成绩的学生 (提示:LEFT JOIN + NULL 判断)

SELECT s.name
FROM student s
LEFT JOIN score c
ON s.id = c.student_id
WHERE c.id IS NULL;

2️⃣ 查询 没有学生信息的成绩记录

SELECT c.*
FROM student s
RIGHT JOIN score c
ON s.id = c.student_id
WHERE s.id IS NULL;

七、教师用一句话总结

JOIN 的本质不是“连表”,而是“决定保留哪些不匹配的数据”


如果你愿意,我可以下一步直接帮你做成:

  • 🔹 考试操作题(含标准答案)
  • 🔹 一张“JOIN 结果对比图(行数变化)”
  • 🔹 把 RIGHT JOIN 改写成 LEFT JOIN(面试常考)

你是打算 上课讲 / 给学生做实训 / 出试卷 用?我可以按用途再给你精修一版。