前言在实际项目开发中数据通常分散在多张表里。比如用户表、订单表、商品表、权限表很少单表就能拿到完整结果。多表联查就是把多张表按关联条件合并一次性查询出所需数据是后端、测试、数据分析必备技能。本文使用学生表 (student)、成绩表 (score)、课程表 (course)三张经典案例表从零讲解多表联查。一、准备测试表与数据先建表插数据可直接复制运行-- 学生表 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20), age INT, gender VARCHAR(10) ); -- 成绩表 CREATE TABLE score( id INT PRIMARY KEY, student_id INT, course_id INT, score INT ); -- 课程表 CREATE TABLE course( id INT PRIMARY KEY, name VARCHAR(20) ); -- 插入测试数据 INSERT INTO student VALUES(1,张三,18,男),(2,李四,19,男),(3,翠花,18,女); INSERT INTO course VALUES(101,语文),(102,数学),(103,英语); INSERT INTO score VALUES(1,1,101,88),(2,1,102,95),(3,2,101,76),(4,3,103,92);二、多表联查核心连接类型一网打尽1. INNER JOIN内连接作用只返回两张表匹配成功的数据没有匹配的不显示。场景查有成绩的学生 课程 分数。SELECT s.name AS 学生姓名, c.name AS 课程名称, sc.score AS 分数 FROM student s INNER JOIN score sc ON s.id sc.student_id INNER JOIN course c ON sc.course_id c.id;要点INNER JOIN 可以省略 INNER直接写 JOINON 必须写关联条件不能用错字段结果只显示有成绩的学生2. LEFT JOIN左连接作用左表数据全部显示右表匹配不到显示 NULL。场景查所有学生不管有没有成绩。SELECT s.name AS 学生姓名, c.name AS 课程名称, sc.score AS 分数 FROM student s LEFT JOIN score sc ON s.id sc.student_id LEFT JOIN course c ON sc.course_id c.id;使用最多业务中常用左连接保证主表数据不丢失。3. RIGHT JOIN右连接作用右表全部显示左表匹配不到显示 NULL。场景查所有课程不管有没有人选。SELECT s.name AS 学生姓名, c.name AS 课程名称, sc.score AS 分数 FROM student s RIGHT JOIN score sc ON s.id sc.student_id RIGHT JOIN course c ON sc.course_id c.id;4. FULL JOIN全连接作用左右表数据全部显示匹配不上补 NULL。MySQL 不支持 FULL JOIN可用 UNION 模拟-- 左连接 右连接 去重 全连接 SELECT * FROM student s LEFT JOIN score sc ON s.idsc.student_id UNION SELECT * FROM student s RIGHT JOIN score sc ON s.idsc.student_id;三、多表联查高频用法1. 三表联查最常用学生 成绩 课程一次性查出完整信息SELECT s.id AS 学号, s.name AS 姓名, c.name AS 课程, sc.score AS 成绩 FROM student s JOIN score sc ON s.idsc.student_id JOIN course c ON sc.course_idc.id;2. 带条件的多表联查查询张三的所有成绩SELECT c.name AS 课程, sc.score AS 分数 FROM student s LEFT JOIN score sc ON s.idsc.student_id LEFT JOIN course c ON sc.course_idc.id WHERE s.name张三;3. 分组统计 多表联查统计每个学生的平均分SELECT s.name, AVG(sc.score) AS 平均分 FROM student s LEFT JOIN score sc ON s.idsc.student_id GROUP BY s.name;4. 自连接自己连自己适用层级数据、上下级、评论回复等。-- 示例查询同龄学生 SELECT s1.name,s2.name FROM student s1,student s2 WHERE s1.ages2.age AND s1.ids2.id;四、多表联查避坑指南重点必须加 ON 条件否则出现笛卡尔积数据爆炸关联字段要加索引大数据量联查必卡顿少用 FULL JOINMySQL 不支持且效率低别名简化表名sstudent、scscore可读性更高先过滤再联查用子查询 / WHERE 减少数据量五、面试常问JOIN 总结INNER JOIN取交集LEFT JOIN左表全量 右表匹配RIGHT JOIN右表全量 左表匹配多表联查主表放左边用 LEFT JOIN 最稳六、总结多表联查核心是找关联字段外键日常开发优先用LEFT JOIN三表联查套路主表 JOIN 附表 1 JOIN 附表 2避坑无 ON 必错、大数据必加索引学会多表联查你就能搞定 90% 的业务查询需求