SQL 多表查询 完整版独立笔记

一、多表查询核心原理

多表查询用于查询两张及两张以上关联数据表 的数据,核心依靠主键与外键关联字段匹配数据(如学生表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 写在关联语句之后

相关推荐
星恒随风2 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
吴名氏.4 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
爱码少年4 小时前
Springboot下如何将CSV文件数据导入H2、Mysql数据库表
数据库·mysql·csv
2603_969694855 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea5 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
数据技术说6 小时前
在 KES AI 数据库上搭一条 NL2SQL 链路:语义、召回、权限各放哪
人工智能·sql·代码规范
阿义有问题6 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
Go Work9 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
猫猫不是喵喵.9 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
Oll Correct9 小时前
Adobe illustrator 案例十四:花元素标志草图绘制
笔记·ui·adobe·illustrator