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

相关推荐
Warolitbos17 分钟前
【数据库】SQL进阶15题,窗口函数/索引/事务一页速查
数据库·sql·学习·mysql·面试
BioRunYiXue17 分钟前
使用docker分析高通量测序数据
java·数据库·人工智能·spring cloud·docker·tomcat·html
卓豪终端管理26 分钟前
300 台终端补丁推送完成 ≠ 漏洞关闭:补丁稽核闭环的状态机与工程落点
网络·数据库·php
l1t1 小时前
DeepSeek总结的PostgreSQL 中的二进制只读副本,第三部分
数据库·postgresql
从零数据分析1 小时前
零基础学SQL 23:和上月比总对不上?LAG/LEAD 一步取出上一次(附 4 个模板)
java·数据库·sql·mysql·oracle·sqlite·database
码士集团小青1 小时前
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
数据库·redis·缓存
太理摆烂哥1 小时前
MySQL的查询
数据库·mysql
码士集团小青1 小时前
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
数据库·redis·缓存
愤怒火龙果2 小时前
蓝队笔记整理04 安全设备、内网处置与云上防护
笔记·网络安全
钱栈up2 小时前
配料秤料位查出来是负数——IoTDB存的是周期增量,我却在拿首尾相减
前端·数据库