一、笛卡尔积 × vs 自然连接 ⋈

很多新手容易混淆,先划重点:

  1. 笛卡尔积 (R×S):只是把两张表所有行两两配对,不做筛选、不合并同名列;
  2. 自然连接 (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每一行:

  1. R第一行(a1,b1) + S第一行(b1,c1) → (a1,b1,b1,c1)
  2. R第一行(a1,b1) + S第二行(b3,c2) → (a1,b1,b3,c2)
  3. R第二行(a2,b2) + S第一行(b1,c1) → (a2,b2,b1,c1)
  4. 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

  1. 行数 = R行数 × S行数;
  2. 列 = R所有列 + S所有列,同名列不合并、不删除;
  3. 无任何筛选,所有行随便配对。

2. 自然连接 R ⋈ S

三步流程:

  1. 求笛卡尔积 R×S;
  2. 筛选:两张表所有名字相同的列,对应数值必须相等
  3. 去重:删掉重复的同名列,每种属性只保留一列;

特殊情况补充

  1. 两张表没有任何同名属性:自然连接等价于笛卡尔积,不会删任何行;
  2. 没有任何行满足同名列相等:自然连接结果是空表;
  3. 多张公共列(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
  1. 笛卡尔积共 2×2=4 行;
  2. 筛选条件:R.B=S.B 且 R.C=S.C,仅第一行匹配;
  3. 删重复B、C;
    最终自然连接:
    A B C D
    1 2 3 9