2.6关系操作
所有的过程关系查询语言都提供一组操作,这些操作可以应用于单个关系或一对关系。这些操作具有良好的和期望的属性,它们的结果总是一个单一的关系。这个属性允许一个以模块化的方式组合其中的几个操作。具体来说,由于关系查询的结果本身就是一个关系,因此关系操作可以应用于查询的结果和给定的关系集。
具体的关系操作根据语言的不同而有所不同,但是适合我们在本节中描述的通用框架。在第3章中,我们展示了用SQL表示操作的具体方式。
最常见的操作是从单个关系(比如教练)中选择特定的元组,这些元组满足某些特定的谓词(比如$8.5万美元)。结果是一种新的关系,它是原始关系的子集(内结构)。例如,如果我们从图2.1的讲师关系中选择元组,满足谓词工资大于$85000,我们得到如图2.10所示的结果。
表2.10 查询选择讲师的结果,工资超过$85000
另一个常见的操作是从一个关系中选择某些属性(列)。结果是只有那些选择的属性的新关系。例如,假设我们想要一个教师ID和薪水的列表,而不需要从图2.1的讲师关系中列出姓名和dept的名称值,那么结果如图2.11所示,具有两个属性ID和薪水。结果中的每个元组都来自于讲师关系的一个元组,但是只包含所显示的选定的属性。
连接操作允许将两个关系的组合合并成一个元组,将两个关系中的一个元组合并成一个元组。有许多不同的方式来连接关系(我们将在第3章中看到)。图2.12显示了一个从教师和部门表中加入元组的例子,新的元组显示了关于每个教师和她正在工作的部门的信息。这个结果是通过将每个元组与讲师关系中的元组结合在一起的。
在图2.12中所示的连接的形式中,这被称为“自然连接”,来自于讲师关系的一个元组与部门关系中的一个元组匹配,如果它们的dept名称属性的值相同的话。所有这些匹配的元组都出现在连接结果中。一般来说,两个关系中的自然连接操作会匹配元组的值,这些元组的值在所有的属性名称中都是相同的。
表2.11 从教师关系中选择属性ID和薪水的结果
表2.12教师与部门关系的自然加入
笛卡尔积操作结合了两个关系中的元组,但是不像连接操作,它的结果包含了两个关系中的所有元组,不管它们的属性值是否匹配。
因为关系是集合,所以我们可以对关系进行正常的集合操作。union操作执行两个类似结构的表的集合(比如所有研究生的表和所有本科生的表)。例如,一个部门可以获得所有学生的集合。其他的集合操作,例如交叉和设置差异也可以执行。
如前所述,我们可以对查询结果执行操作。例如,如果我们想找到那些年薪超过8.5万美元的教师的ID和薪水,我们将在上面的例子中执行前两个操作。首先,我们从教师关系中选择这些元组,其中的工资值大于$8.5,然后,从这个结果中选择两个属性ID和薪水,结果显示在图2.13中所示的关系,包括ID和薪水。在本例中,我们可以以任意顺序执行操作,但在所有可能出现的情况下,我们所能看到的事实并非如此。
表2.13 选择年薪超过8.5万美元的教师的属性ID和工资
关系代数
关系代数定义一组关于关系的运算,与通常的代数运算,如加法、减法或乘法运算,这些运算都是对数字运算的。正如对数字的代数运算将一个或多个数字作为输入,并返回一个数字作为输出,关系代数操作通常会将一个或两个关系作为输入,并作为输出返回一个关系。
在第六章中详细介绍了关系代数,但是我们概述了下面的一些操作。
有时,查询的结果包含重复的元组。例如,如果我们从教师关系中选择dept name属性,就会有一些重复的例子,包括合成。Sci。它出现了三次。某些关系语言严格遵循一个集合的数学定义,并删除副本。另外,考虑到从大型结果关系中删除副本所需的大量处理,保留副本。在后一种情况下,关系并不是纯粹的数学意义上的关系。
当然,数据库中的数据必须随时间变化。可以通过插入新的元组、删除现有的元组或修改某些属性的值来更新关系。可以删除整个关系,并创建新的关系。
我们将在第3章到第5章中讨论使用SQL语言的关系查询和更新。