一、多表查询核心原理
多表查询用于查询两张及两张以上关联数据表 的数据,核心依靠主键与外键关联字段匹配数据(如学生表StudentId、班级表ClassId)。
SQL多表连接分为三类:内连接、左外连接、右外连接,核心区别在于「是否保留不匹配数据」。
二、内连接 INNER JOIN(最常用、必考)
1. 核心特点
取两张表的数据交集 ,只显示关联匹配成功的数据,任意一张表无匹配数据则直接过滤,不展示。
表的交换顺序,查询结果完全一致。
2. 两表内连接(学生表+成绩表)
sql
-- 查询分数大于90的学生信息+成绩
select Students.StudentId,Name,Sex,Score
from Students
inner join ScoreList on Students.StudentId = ScoreList.StudentId
where Score>90
3. 调换表顺序(结果不变)
sql
select Students.StudentId,Name,Sex,Score
from ScoreList
inner join Students on Students.StudentId = ScoreList.StudentId
where Score>90
4. 三表内连接(学生+成绩+班级)
sql
-- 查询90分以上学生的信息、成绩、班级名称
select Students.StudentId,Name,Sex,Score,ClassName
from ScoreList
inner join Students on Students.StudentId = ScoreList.StudentId
inner join Class on Class.ClassId = Students.ClassId
where Score>90
三、左外连接 LEFT OUTER JOIN(左表优先)
1. 核心特点
以左表为基准,左表所有数据全部保留;右表匹配不到的对应数据,自动填充为 NULL。
调换表顺序后,基准表改变,查询结果完全不同。
2. 标准写法(学生表左表、成绩表右表)
sql
-- 查询所有男生信息,包含无成绩的学生(成绩显示NULL)
select Students.StudentId,Name,Sex,Score
from Students
left outer join ScoreList on Students.StudentId = ScoreList.StudentId
where Sex='男'
3. 调换表顺序(基准切换为成绩表)
sql
select Students.StudentId,Name,Sex,Score
from ScoreList
left outer join Students on Students.StudentId = ScoreList.StudentId
where Sex='男'
四、右外连接 RIGHT OUTER JOIN(右表优先)
1. 核心特点
以右表为基准,右表所有数据全部保留;左表匹配不到的对应数据,自动填充为 NULL。
2. 标准写法(班级表为右表)
sql
-- 查询所有班级信息,包含无学生的班级(学生信息显示NULL)
select Students.StudentId,Name,Sex,ClassName
from Students
right outer join Class on Students.ClassId = Class.ClassId
where Sex='男'
3. 调换表顺序(基准切换为学生表)
sql
select Students.StudentId,Name,Sex,ClassName
from Class
right outer join Students on Students.ClassId = Class.ClassId
where Sex='男'
五、三类连接终极对比(必背考点)
| 连接方式 | 核心规则 | 适用场景 |
|---|---|---|
| 内连接 INNER JOIN | 只保留两张表匹配成功的数据(交集) | 查询有关联、有完整数据的记录 |
| 左外连接 LEFT JOIN | 左表数据全部保留,右表无匹配为NULL | 查询全部主数据,附属数据可缺失 |
| 右外连接 RIGHT JOIN | 右表数据全部保留,左表无匹配为NULL | 查询全部附属分类,主数据可缺失 |
六、考试易错点总结
-
多表查询必须用 ON 指定关联条件,不能用 WHERE 代替关联条件
-
内连接表顺序不影响结果,左右连接表顺序直接改变结果
-
左/右连接会产生 NULL 空值数据,内连接无空值
-
多表同名字段,必须加表名区分(如 Students.StudentId)
-
筛选条件 WHERE 写在关联语句之后