2.6 关系运算

2.6 关系运算

关系运算可以施加在多个关系上

所有的过程化关系査询语言都提供了一组运算,这些运算要么施加于单个关系上,要么施加于一对关系上。

运算结果总是单个关系

这些运算具有一个很好的,并且也是所需的性质:运算结果总是单个的关系。

可以对关系查询结果再次执行关系运算

由于关系查询的结果本身也是关系,所以关系运算可施加到查询结果上,正如施加到给定关系集上一样。

常见关系运算

从单个关系中选择满足特定谓词的元组

最常用的关系运算是从单个关系(如instructor)中选出满足一些特定谓词(如salary>85000美元)的特殊元组。其结果是一个新关系,它是原始关系(instructor)的一个子集。

从一个关系中选出特定的属性

另一个常用的运算是从一个关系中选出特定的属性(列)。其结果是一个只包含那些被选择属性的新关系。
例如,假设我们从instructor关系中只希望列出教师的ID和工资,但不列出namedept_name的值,那么其结果有IDsalary两个属性。结果中的每个元组都是从instructor关系中的某个元组导出的,不过只具有被选中的属性。

连接运算

连接运算可以把分别来自两个关系的元组对合并成单个元组
有几种不同的方式来对关系进行连接

例如一个连接来自instructordepartment表中元组的例子,新元组给出了有关每个教师及其工作所在系的信息。此结果是通过把instructor关系中的每个元组和department关系中对应于教师所在系的元组合并形成的。

自然连接

自然连接运行两个关系合并那些公共属性的取值都相同元组。

笛卡儿积运算

笛卡儿积运算合并两个关系中的所有元组,无论它们的属性值是否匹配。

可以对关系执行集合运算

因为关系是集合,所以我们可以在关系上施加标准的集合运算
集合并运算可以在两个”相似结构”的表上执行集合并操作,(比如一个所有毕业生的表和一个所有大学生的表)。例如,我们可以得到一个系中所有学生的集合。
另外的集合运算如集合交运算集合差运算也都可以被执行。

在查询结果上施加运算

我们可以在查询结果上施加运算。例如,如果我们想找出工资超过85000美元的那些教师的IDsalary:

  • 首先我们从instructor关系中选出salary值大于85000美元的元组,
  • 然后从结果中选出IDsalary两个属性

查询结果中可能有重复值

查询结果中可能会包含重复的元组。
一些关系语言严格遵守集合的数学定义(集合中不能有重复),去除了重复。
另一些关系语言考虑到去除重复需要大量相关的处理,就保留了重复,这种情况下的关系将不再是纯粹数学意义上的真正关系

关系代数

关系代数定义了在关系上的一组运算,对应于作用在数字上的普通代数运算,如加法减法乘法。正如作用在数字上的代数运算以一个或多个数字作为输入,返回一个数字作为输出,关系代数运算通常以一个或两个关系作为输入,返回一个关系作为输出

关系运算概述

第6章将详细介绍关系代数,下面我们给出几个运算的概述:

关系运算 描述
选择 返回输入关系中满足谓词的行
投影 对输入关系的所有行输出指定的属性。从输出中去除重复元组
自然连接 从两个输入关系中输出**共同属性取值相同**的元组对
笛卡儿积 从两个输入关系中输出所有的元组对(无论它们在共同属性上的取值是否相同)
输出两个输入关系中元组的并

上面的关系运算符省略,要想详细了解请看书中本节的末尾.