2.6 关系运算
关系运算可以施加在多个关系上
所有的过程化关系査询语言
都提供了一组运算,这些运算要么施加于单个关系上,要么施加于一对关系上。
运算结果总是单个关系
这些运算具有一个很好的,并且也是所需的性质:运算结果总是单个的关系。
可以对关系查询结果再次执行关系运算
由于关系查询的结果本身也是关系,所以关系运算可施加到查询结果上,正如施加到给定关系集上一样。
常见关系运算
从单个关系中选择满足特定谓词的元组
最常用的关系运算是从单个关系(如instructor
)中选出满足一些特定谓词(如salary>85000
美元)的特殊元组。其结果是一个新关系
,它是原始关系(instructor
)的一个子集。
从一个关系中选出特定的属性
另一个常用的运算是从一个关系中选出特定的属性(列)。其结果是一个只包含那些被选择属性的新关系。
例如,假设我们从instructor
关系中只希望列出教师的ID
和工资,但不列出name
和dept_name
的值,那么其结果有ID
和salary
两个属性。结果中的每个元组都是从instructor
关系中的某个元组导出的,不过只具有被选中的属性。
连接运算
连接运算
可以把分别来自两个关系的元组对合并成单个元组。
有几种不同的方式来对关系进行连接
例如一个连接来自instructor
和department
表中元组的例子,新元组给出了有关每个教师及其工作所在系的信息。此结果是通过把instructor
关系中的每个元组和department
关系中对应于教师所在系的元组合并形成的。
自然连接
自然连接运行
从两个关系
中合并
那些公共属性的取值都相同
元组。
笛卡儿积运算
笛卡儿积运算
合并两个关系中的所有元组,无论它们的属性值是否匹配。
可以对关系执行集合运算
因为关系是集合,所以我们可以在关系上施加标准的集合运算
。集合并运算
可以在两个”相似结构”的表上执行集合并操作,(比如一个所有毕业生的表和一个所有大学生的表)。例如,我们可以得到一个系中所有学生的集合。
另外的集合运算如集合交运算
和集合差运算
也都可以被执行。
在查询结果上施加运算
我们可以在查询结果上施加运算。例如,如果我们想找出工资超过85000美元的那些教师的ID
和salary
:
- 首先我们从
instructor
关系中选出salary
值大于85000美元的元组, - 然后从结果中选出
ID
和salary
两个属性
查询结果中可能有重复值
查询结果中可能会包含重复的元组。
一些关系语言严格遵守集合的数学定义(集合中不能有重复),去除了重复。
另一些关系语言考虑到去除重复需要大量相关的处理,就保留了重复,这种情况下的关系将不再是纯粹数学意义上的真正关系
关系代数
关系代数定义了在关系上的一组运算,对应于作用在数字上的普通代数运算,如加法
、减法
或乘法
。正如作用在数字上的代数运算以一个或多个数字作为输入,返回一个数字作为输出,关系代数运算通常以一个或两个关系作为输入,返回一个关系作为输出。
关系运算概述
第6章将详细介绍关系代数,下面我们给出几个运算的概述:
关系运算 | 描述 |
---|---|
选择 | 返回输入关系中满足谓词的行 |
投影 | 对输入关系的所有行输出指定的属性。从输出中去除重复元组 |
自然连接 | 从两个输入关系中输出共同属性 取值相同的元组对 |
笛卡儿积 | 从两个输入关系中输出所有的元组对(无论它们在共同属性上的取值是否相同) |
并 | 输出两个输入关系中元组的并 |
上面的关系运算符省略,要想详细了解请看书中本节的末尾. |
原文链接: 2.6 关系运算