笛卡尔积与自然连接
一、笛卡尔积 × vs 自然连接 ⋈
很多新手容易混淆,先划重点:
- 笛卡尔积 (R×S):只是把两张表所有行两两配对,不做筛选、不合并同名列;
- 自然连接 (R \bowtie S):先做笛卡尔积 → 再自动筛选同名列值相等 → 再删掉重复的同名字段,是带条件、去重复列的笛卡尔积。
前置基础:表结构约定
设关系(二维表)
- (R(A,B)):属性列 A、B
- (S(B,C)):属性列 B、C
公共列:B(同名同类型,自然连接的匹配键)
二、笛卡尔积怎么算
定义
若 (R) 有 (m) 行,(S) 有 (n) 行,笛卡尔积 (R×S) 有 (m×n) 行;
列 = R全部列 + S全部列,同名列会重复保留。
举例实操
设:
表R
| A | B |
|---|---|
| a1 | b1 |
| a2 | b2 |
表S
| B | C |
|---|---|
| b1 | c1 |
| b3 | c2 |
计算 R×S(笛卡尔积)
把R每一行,分别拼接S每一行:
- R第一行(a1,b1) + S第一行(b1,c1) → (a1,b1,b1,c1)
- R第一行(a1,b1) + S第二行(b3,c2) → (a1,b1,b3,c2)
- R第二行(a2,b2) + S第一行(b1,c1) → (a2,b2,b1,c1)
- R第二行(a2,b2) + S第二行(b3,c2) → (a2,b2,b3,c2)
结果表 (R×S):
| A | B_R | B_S | C |
|---|---|---|---|
| a1 | b1 | b1 | c1 |
| a1 | b1 | b3 | c2 |
| a2 | b2 | b1 | c1 |
| a2 | b2 | b3 | c2 |
规律:行数=R行数 × S行数,列直接拼接,同名字段分开存在。
三、自然连接 (R \bowtie S) 完整三步(核心)
自然连接 = 带匹配条件的笛卡尔积,固定3步:
步骤1:计算笛卡尔积 (R×S)
同上,得到所有组合行,包含重复同名列。
步骤2:筛选:所有同名属性取值相等
本例公共属性只有B,只保留:(R.B = S.B) 的行
看上面积笛卡尔积4行,只有第一行满足 (b1=b1),其余全部删掉。
筛选后只剩一行:
| A | B_R | B_S | C |
|---|---|---|---|
| a1 | b1 | b1 | c1 |
步骤3:删除重复的同名属性列
两列B内容完全一样,删掉一列,只留一个B。
最终自然连接 (R \bowtie S)
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
四、总结
1. 笛卡尔积 R×S
- 行数 = R行数 × S行数;
- 列 = R所有列 + S所有列,同名列不合并、不删除;
- 无任何筛选,所有行随便配对。
2. 自然连接 R ⋈ S
三步流程:
- 求笛卡尔积 R×S;
- 筛选:两张表所有名字相同的列,对应数值必须相等;
- 去重:删掉重复的同名列,每种属性只保留一列;
特殊情况补充
- 两张表没有任何同名属性:自然连接等价于笛卡尔积,不会删任何行;
- 没有任何行满足同名列相等:自然连接结果是空表;
- 多张公共列(R(A,B,C),S(B,C,D)):必须同时满足 R.B=S.B 且 R.C=S.C 才保留。
五、小练习
R(A,B,C)
| A | B | C |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 5 | 6 |
S(B,C,D)
| B | C | D |
|---|---|---|
| 2 | 3 | 9 |
| 5 | 7 | 8 |
- 笛卡尔积共 2×2=4 行;
- 筛选条件:R.B=S.B 且 R.C=S.C,仅第一行匹配;
- 删重复B、C;
最终自然连接:A B C D 1 2 3 9
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 皖月清风的个人博客!
评论




