转载自:《database.system.concepts》(数据库系统概念)P48-52
所有的过程关系查询语言都提供一组操作,这些操作可以应用于单个关系或一对关系。这些操作具有良好的和期望的属性,它们的结果总是一个单一的关系。这个属性允许一个以模块化的方式组合其中的几个操作。具体来说,由于关系查询的结果本身就是一个关系,因此关系操作可以应用于查询的结果以及给定的关系集。
具体的关系操作根据语言的不同而有所不同,但是适合我们在本节中描述的通用框架。在第3章中,我们展示了用SQL表示操作的具体方式。
ID |
名字 |
部门名称 |
12121 |
Wu |
金融 |
22222 |
Einstein |
物理 |
33456 |
Gold |
物理 |
83821 |
Brandt |
比较科学 |
图2.10的查询选择讲师的结果,工资超过$85000
另一个常见的操作是从一个关系中选择某些属性(列)。结果是只有那些选择的属性的新关系。例如,假设我们想要一个教师ID和薪水的列表,而不需要从图2.1的讲师关系中列出姓名和dept的名称值,那么结果如图2.211所示,具有两个属性ID和薪水。结果中的每个元组都来自于讲师关系的一个元组,但是只包含所显示的选定的属性。
ID |
工资 |
10101 12121 15151 22222 32343 33456 45565 58583 76543 76766 83821 98345 |
65000 90000 40000 95000 60000 87000 75000 62000 80000 72000 92000 80000 |
图2.11查询从教师关系中选择属性ID和薪水的结果。
图2.12教师和部门关系的自然连接结果。
ID |
薪水 |
12121 22222 33456 83821 |
90000 95000 87000 92000 |
图2.13的结果是,教师的属性ID和薪水超过了8.5万美元。
连接操作允许将两个关系的组合合并成一个元组,将两个关系中的一个元组合并成一个元组。有许多不同的方式来连接关系(我们将在第3章中看到)。图2.12显示了一个从教师和部门表中加入元组的例子,新的元组显示了关于每个教师和她正在工作的部门的信息。这一结果是通过将教师关系中的每个元组与教师系的部门关系中的元组相结合而形成的。
在图2.12中所示的连接的形式中,这被称为“自然连接”,来自于讲师关系的一个元组与部门关系中的一个元组匹配,如果它们的dept名称属性的值相同的话。所有这些匹配的元组都出现在连接结果中。一般来说,两个关系中的自然连接操作会匹配元组的值,这些元组的值在所有的属性名称中都是相同的。
笛卡尔产品操作结合了两个关系中的元组,但是不像连接操作,它的结果包含了两个关系中的所有元组,不管它们的属性值是否匹配。
因为关系是集合,所以我们可以对关系进行正常的集合操作。union操作执行两个“类似结构”的表(比如所有研究生的表和所有本科生的表)。例如,一个部门可以获得所有学生的集合。其他的集合操作,例如交叉和设置差异也可以执行。
如前所述,我们可以对查询结果执行操作。例如,如果我们想找到那些年薪超过8.5万美元的教师的ID和薪水,我们将在上面的例子中执行前两个操作。首先,我们从教师关系中选择这些元组,其中的工资值大于$8.5,然后,从这个结果中选择两个属性ID和薪水,结果显示在图2.13中所示的关系,包括ID和薪水。在本例中,我们可以以任意顺序执行操作,但在所有情况下都不是这样,我们将看到。
有时,查询的结果包含重复的元组。例如,如果我们从教师关系中选择dept name属性,那么就会出现一些重复的情况,包括“补偿”。科学。,它出现了三次。某些关系语言严格遵循一个集合的数学定义,并删除副本。另外,考虑到从大型结果关系中删除副本所需的大量处理,保留副本。在后一种情况下,关系并不是纯粹的数学意义上的关系。
当然,数据库中的数据必须随时间变化。可以通过插入新的元组、删除现有的元组或修改某些属性的值来更新关系。可以删除整个关系,并创建新的关系。
我们将在第3章到第5章中讨论使用SQL语言的关系查询和更新。
关系代数
关系代数定义一组关于关系的运算,与通常的代数运算,如加法、减法或乘法运算,这些运算都是对数字运算的。正如在数字上的代数运算将一个或多个数字作为输入,并返回一个数字作为输出,关系代数运算通常会将一到两个关系作为输入,然后返回一个关系作为输出。
在第六章中详细介绍了关系代数,但是我们概述了下面的一些操作。
从两个输入关系输出元组的结合。