文章目录
- 数据库所有连接
-
- 一、先总纲(所有连接层级)
- 二、准备两张测试表(全程用这俩)
- 1. 笛卡尔积(最原始、所有连接的祖宗)
-
-
- 规则
- 语句
- 结果
-
- 2. 等值连接(最常用)
-
-
- 规则
- 语句
- 结果
-
- 3. 自然连接(Natural Join)【特殊等值连接】
-
-
- 规则
- 语句
- 结果
-
- 4. 内连接 Inner Join
-
-
- 规则
- 通俗
-
- 5. 外连接(重点必考)
-
- (1)左外连接 Left Join
-
- 规则
- (2)右外连接 Right Join
- (3)全外连接 Full Join
- 三、一张表彻底区分(软考必背)
- 四、终极本质总结(你说的完全对)
- 五、秒杀口诀
- 例子
-
- 1、π 投影 → 操作【列】
- 2、σ 选择 → 操作【行】
- 3、JOIN 连接 → 操作【列】
- 4、UNION 并集 → 操作【行】
- 极简背诵总结
数据库所有连接
✅ 连接本质:就是按条件 合并两张表的「列」,行做匹配 不是合并行,是横向拼接列,完全正确。
一、先总纲(所有连接层级)
- 左外连接(Left)
- 右外连接(Right)
- 全外连接(Full)
二、准备两张测试表(全程用这俩)
表A(学生)
| 1 | 张三 |
| 2 | 李四 |
表B(成绩)
| 1 | 90 |
| 3 | 80 |
1. 笛卡尔积(最原始、所有连接的祖宗)
规则
不写任何条件,左表每一行 × 右表每一行 纯暴力拼接列
语句
select * from A,B;
结果
行数爆炸,列直接全部拼在一起 A所有列 + B所有列 👉 本质:无脑拼接列,无匹配
2. 等值连接(最常用)
规则
用 = 做匹配,按字段值相等 拼接列 同名字段会重复保留
语句
select * from A join B on A.id = B.id;
结果
| 1 | 张三 | 1 | 90 |
👉 特点: 只保留匹配上的行,列全部保留、重复字段不合并
3. 自然连接(Natural Join)【特殊等值连接】
规则
语句
select * from A natural join B;
结果
| 1 | 张三 | 90 |
👉 核心区别: 等值连接:重复列保留 自然连接:重复列合并去重
4. 内连接 Inner Join
规则
和「等值连接」日常几乎画等号 只返回两张表 完全匹配的数据 不匹配的直接扔掉
通俗
两边都有的数据,才显示
5. 外连接(重点必考)
(1)左外连接 Left Join
规则
以左表A为全集 左表所有行全部保留,右表匹配不上补 NULL
select * from A left join B on A.id=B.id;
结果:
| 1 | 张三 | 90 |
| 2 | 李四 | NULL |
(2)右外连接 Right Join
以右表B为全集 右表全保留,左表没匹配补NULL
结果:
| 1 | 张三 | 90 |
| 3 | NULL | 80 |
(3)全外连接 Full Join
左右两表全部数据都保留 哪边没匹配,哪边补NULL MySQL 无原生 full,可 union 实现
三、一张表彻底区分(软考必背)
| 笛卡尔积 | 无规则全组合 | 全部保留 | 全保留 |
| 等值连接 | 字段=匹配 | 保留重复列 | 不保留 |
| 自然连接 | 自动同名=匹配 | 自动合并去重 | 不保留 |
| 内连接 | 条件匹配 | 自己控制 | 不保留 |
| 左外连接 | 条件匹配 | 自己控制 | 左表全留 |
| 右外连接 | 条件匹配 | 自己控制 | 右表全留 |
四、终极本质总结(你说的完全对)
- 内连接:取交集
- 外连接:取全集+补空
- 自然连接:自动版等值+去重
五、秒杀口诀
- 笛卡尔:无脑全拼
- 等值连接:相等就合,字段重复
- 自然连接:同名自动合,重复删掉
- 内连接:匹配才要
- 左连接:左表全包
- 右连接:右表全包
例子
先建两张测试表,统一用例,全程好懂: 学生表
S
(
s
i
d
,
s
n
a
m
e
,
a
g
e
)
S(\\boldsymbol{sid},\\ sname,\\ age)
S(sid, sname, age) 选课表
S
C
(
s
i
d
,
c
i
d
,
s
c
o
r
e
)
SC(\\boldsymbol{sid},\\ cid,\\ score)
SC(sid, cid, score)
1、π 投影 → 操作【列】
作用:挑选、保留指定字段(列),剔除不要的列 关系代数:
π
s
i
d
,
s
n
a
m
e
(
S
)
\\boldsymbol{\\pi_{sid,sname}(S)}
πsid,sname(S) SQL:
SELECT sid, sname FROM S;
只保留 sid、sname 两列,age 直接删掉 👉 只动列,不动行数量(不删数据行)
2、σ 选择 → 操作【行】
作用:按条件筛选数据行,列不变 关系代数:
σ
a
g
e
>
18
(
S
)
\\boldsymbol{\\sigma_{age>18}(S)}
σage>18(S) SQL:
SELECT * FROM S WHERE age > 18;
整张表列全都保留,只把「年龄大于18」的行挑出来 👉 只筛行,列结构完全不变
3、JOIN 连接 → 操作【列】
作用:多表横向拼接字段,合并列 关系代数:
S
⋈
S
C
S \\bowtie SC
S⋈SC SQL:
SELECT * FROM S JOIN SC ON S.sid = SC.sid;
左边学生列 + 右边选课列,合成一张宽表 核心是拼接列,on 只是用来过滤无效行 👉 本质:列合并
4、UNION 并集 → 操作【行】
作用:上下合并数据行,列结构不变 SQL:
SELECT sid FROM S
UNION
SELECT sid FROM SC;
两个查询列数/类型一致,把结果集的行上下堆叠合并 不新增列,只叠加数据行 👉 本质:行合并、行去重
极简背诵总结
π
\\pi
π 投影:选列 → select 字段
σ
\\sigma
σ 选择:选行 → where 条件


