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 写在关联语句之后

相关推荐
阿米亚波8 小时前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
Nontee8 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
AnsonNie9 小时前
Ubuntu系统安装裕太微YT6801网卡驱动【笔记】
笔记·ubuntu
眞bilibili9 小时前
带团队后的日常思考(十七)
数据库
laboratory agent开发9 小时前
智能体多工具串联执行中途失败,部分写入的数据如何回滚
运维·服务器·数据库
xqqxqxxq10 小时前
DML 表数据:插入、删除、修改
笔记·mysql
段一凡-华北理工大学10 小时前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化
DBA_G10 小时前
南大通用GBase HD数据平台讲解
数据库
不会代码的小猴10 小时前
Linux note2
linux·笔记
foolishlee10 小时前
Neon wal日志处理流程
数据库