跳到主要内容

笛卡尔积和自然连接

笛卡尔积和自然连接都是关系数据库中用于组合关系(表)的操作,但它们的结果和方式截然不同。

1. 笛卡尔积 (Cartesian Product)

笛卡尔积简单来说就是将两个关系的所有可能的组合都列出来。 如果关系R有m行,关系S有n行,那么R和S的笛卡尔积将有m*n行。 它不考虑关系之间任何属性的匹配或联系。

例子:

假设有两个关系:

关系 学生 (学号, 姓名):

学号姓名
101张三
102李四

关系 课程 (课程号, 课程名):

课程号课程名
C1数学
C2物理

它们的笛卡尔积 学生 × 课程 如下:

学号姓名课程号课程名
101张三C1数学
101张三C2物理
102李四C1数学
102李四C2物理

可以看到,每个学生都与每门课程组合出现,总共有 2 * 2 = 4 行。

2. 自然连接 (Natural Join)

自然连接是一种更高级的连接操作,它只保留那些在两个关系中具有相同值(且属性名相同)的元组的组合。 它隐含地进行等值连接,并去除重复的属性列。

例子:

假设我们有两个关系:

关系 学生成绩 (学号, 课程号, 成绩):

学号课程号成绩
101C180
101C290
102C175

关系 课程 (课程号, 课程名):

课程号课程名
C1数学
C2物理

它们的自然连接 学生成绩 ⋈ 课程 如下: (⋈ 表示自然连接)

学号课程号成绩课程名
101C180数学
101C290物理
102C175数学

可以看到,自然连接只保留了 学生成绩课程课程号 相同的那些行,并且 课程号 只出现一次。

总结:

  • 笛卡尔积 生成所有可能的组合,不管属性值是否匹配。 它通常作为其他连接操作的基础。
  • 自然连接 只保留具有相同属性值(且属性名相同)的行组合,并去除重复属性列。 它更符合实际数据库查询的需求,用于查找相关数据。

选择使用笛卡尔积还是自然连接取决于你的具体需求。 如果需要所有可能的组合,则使用笛卡尔积;如果需要基于公共属性值连接相关数据,则使用自然连接。 自然连接通常效率更高,因为它只处理匹配的行。