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

相关推荐
troy1283 小时前
向量数据库选型指南:Milvus / Qdrant / Chroma / pgvector
数据库·milvus
彧azz3 小时前
Redis 全面指南:从核心概念到高可用架构实战
数据库·redis·架构
DBA小马哥4 小时前
MongoDB 数据同步怎么做?oplog、Change Streams、同步工具 4 种方案一次讲清(附踩坑清单)
数据库·mongodb
Sunshing155 小时前
Lyapunov方程系统本身稳定性判定与镇定性判定
笔记·学习
香菜TTT5 小时前
Redis的哨兵机制
java·数据库·redis
透明的玻璃杯6 小时前
热键驱动 Hotkey Features Integration v9.x(14MB)
笔记
风哥2号7 小时前
数据库教程FGMT13‑Oracle性能优化之数据仓库与分区表
数据库·oracle·性能优化
玉宇夕落7 小时前
Docker + Milvus,数据库永久存放记忆,让对话历史永不丢失
数据库·docker·llm
上海心泾国际物流有限公司7 小时前
我在几个医疗器械仓库记下的一组温湿度数据
经验分享·笔记·学习·健康医疗·交通物流