书城计算机数据库原理及Oracle应用
14082400000003

第3章 关系运算理论

2.1 关系的数学定义

关系模型是1970年由E.F.Codd提出的,经过30多年的发展,在关系模型基础上发展的关系数据库系统(Relation DataBase System)已取得辉煌的成绩,如著名的DB2、Oracle、Sybase、Informix等都是关系数据库系统。

与层次模型、网状模型相比,关系模型有两个显著特点:一是其数据结构简单,即用二维表格表示实体及实体间的联系;二是其有关系运算理论(本章介绍)与关系模式设计理论(第3章介绍)等扎实的理论基础。

本章先介绍关系模型的基本概念、组成和数学定义,然后介绍关系代数运算。要求学习者具有离散数学的初步知识。

2.1.1 关系的基本术语

2.1.1.1 关系模型的基本术语

二维表格对应的关系模式术语如下。

属性:字段或数据项称为属性,也称为列。

属性值:字段值称为属性值。

关系模式:记录类型或表结构称为关系模式,即表头或表框架。表头由一些属性名组成,它对应于数据库结构描述,定义了实体类型。表上属性名必须唯一,不允许重名。关系模式是对关系的描述,一般表示为:

关系名(属性1,属性2……,属性n)

元组:记录称为元组,也称为行。一个元组对应于文件系统中的一个记录,一个记录含有若干个域用以存储属性值。一个元组对应于一个学生实体。

关系:元组的集合称为关系,也称为表格。每个二维表又称为关系。学生信息表是表名,表名对应于一个实体集。表体是由一些行(元组或称记录)组成,它是数据库的内容及数据库操作对象。表体中的列反映实体的属性。

值域:属性的取值范围称为属性的值域,每个属性对应一个值域,不同的属性可以对应同一个值域。

分量:元组中的一个属性值。

基数:元组的个数称为基数,即记录数。

元数:属性的个数称为元数,即列数。

2.1.1.2 关键字

超键(Super Key):若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为超键。

候选键(Candidate Key):不含有多余属性的超键,则称为候选键。也就是说在候选键中,若要再删除属性,就不能唯一地标识一个元组了。

主键(Primary Key):若一个关系有多个候选键,则选定其中一个为主键。

主属性(Primary Attribute):主键的各个属性称为主属性。

非主属性(Non-key Attribute):不包含在任何候选键中的属性称为非主属性。

全码(All-key):在最简单的情况下,候选键只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选键,称为全码。

2.1.1.3 关系的类型

关系有三种类型:基本关系(通常又称为基本表或基表)。

基本表:实际存在的表,它是实际存储数据的逻辑表示。

查询表:查询结果对应的表。

2.1.1.4 关系的性质

在关系数据库中,关系是一种规范化了的二维表格,关系数据库中的关系应具有以下规范化性质。

列是同质的,即每一列中的分量均是同类型的数据,即均来自同一个域。

不同的列可以出自同一个域,也可以出自不同的域。每一列称为一个属性,要给予不同的列不同的属性名。

列的顺序是无所谓的,即列的次序可以变换。

任意两个元组不能完全相同(没有重复元组)。注意:实际的数据库管理系统中(如Oracle 系统),除非定义关系时定义了主键,否则对此没有限制,即允许有重复的元组。

行的顺序是无所谓的,即行的次序可以变换。

每一分量必须是不可再分的最小数据项。

2.1.2 关系的数学定义

域(Domain):一组具有相同数据类型的值(Value)的集合。如:整数、实数、{0,1,2,3}、{真、假}等都是域。

笛卡尔积:给定一组域D1,D2……,Dn,这些域中有些域可以是相同的。D1,D2……,Dn的笛卡尔积为D1×D2×……×Dn{(d1,d2……,dn)│di∈Di,i1,2……,n},其中每一个元素(d1,d2……,dn)叫做一个n元组,或简称元组。元素中的每一个值Di称为一个分量。笛卡尔积可表示为一个二维表。

笛卡尔积的基数:若Di(i1,2……,n)为有限集,其基数为Mi,则笛卡尔积的基数M为MM1*M2*M3*……*Mn。

笛卡尔积的元数:D1×D2×……×Dn的子集叫作域D1,D2……,Dn上的关系,用R(D1,D2……,Dn)表示,这里的R表示关系的名字,n是关系的度(或叫元数),即笛卡尔积的元数。

关系:笛卡尔积的子集,所以关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了加以区分,必须对每列起一个名字,称为属性。n目关系必有n个属性。

2.2 关系数据库

2.2.1 关系模型

关系模型由三部分组成:数据结构(即关系)、关系操作和关系完整性约束。

2.2.1.1 数据结构

在关系模型中,无论是实体还是实体之间的联系均由单一的类型结构(关系)来表示。在用户看来,关系模型中数据的逻辑结构是一张二维表。

关系模式是指关系的描述,即对关系名、组成关系的各属性名、属性值域名、属性间的数据依赖关系及模式的主键等的描述。关系模式通常简记为R(A1,A2……,An),其中R为关系名,A1、A2、An为属性名。

2.2.1.2 关系操作

关系模型规定关系操作的功能和特点,但不对DBMS语言的语法做出具体的规定。

关系操作的特点是集合操作,即操作对象和操作结果都是集合。

关系操作主要分两类:一类是查询操作,另一类是更新操作。其中查询操作有:并(UNION)、交(INTERSECTION)、差(DIFFERENCE)、选择(SELECT)、投影(PROJECT)、联结(JOIN)、除(DIVIDE)等操作,其中选择、投影及联结是最基本的关系操作。这些操作均对关系的内容或表体实施操作的,得到的结果仍为关系。其中更新操作有:增加(INSERT)、删除(DELETE)、修改(UPDATE)操作。

2.2.1.3 关系模型的完整性约束

关系模型允许定义三类完整性约束:实体完整性(Entity Integrity)、参照完整性(Referential Integrity)及用户定义的完整性(User Defined Integrity)。其中实体完整性和参照完整性是任何关系模型都必须满足的完整性约束条件,应该由关系数据库DBMS自动支持。而用户定义的完整性是由DBMS提供完整性定义机制,可以随DBMS厂家不同而有所变化。

1.实体完整性

实体完整性是指:关系的主属性,即主键的值不能为空,也就是关系的主属性不能是空值。在关系数据库系统中一个关系通常对应一个表,实体完整性是针对基本表的。因此实体完整性是指在实际存储数据的基本表中主属性不能取空值。

定义实体完整性的必要性是:关系对应于现实世界中的实体,而现实世界中实体是可区分的。也就是说每个实体具有唯一性标志,在关系模型中,只有主键做唯一标志。若主键取空值,所谓空值就是“不知道"或“无意义"的值,则说明这个实体无法标志,这显然是错误的,与现实世界应用环境矛盾。因此引入实体完整性的概念。

例如,第1章概念模型中所定义的实体“学生”中学号是主键,则该表中学号不能取空值,实体“课程”中课程号是主键,则该表中课程号不能取空值,实体联系“学生-选课”,由于关系模型中实体联系也用二维表来表示,该表的主键是组合属性(学号,课程号),则该表的任意元组中,学号和课程号这两个属性的值均不能为空值,否则就违反了实体完整性要求。

实体完整性规则:若属性A是基本关系R的主属性,则属性A不能取空值。

2.参照完整性

参照完整性的定义是:设FK是基本关系R的一个或一组属性,但不是关系R的主键,如果FK与基本关系S的主键PK相对应,则称FK是基本关系R的外键(Foreign Key),并称基本关系R为依赖关系(Referencing Relation),基本关系S为参照关系(Referenced Relation)。

对R每个元组在FK上的取值只能允许两种可能:一是空值;二是等于S中某个元组的主键值。关系R和S不一定是不同的关系,PK与FK必须定义在同一域中。

参照完整性规则:若属性(或属性组)FK是基本关系R的外键,它与基本关系S的主键PK相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在FK上的值必须为:或者取空值(FK的每个属性值均为空值);或者等于S中某个元组的主键值。参照完整性规则就是定义外键与主键之间的引用规则。

例如,教职工关系(职工号,职工名,工资,部门号)和部门关系(部门号,部门名),其中部门关系中的部门号是主键,职工关系中,对每个职工也有部门号这一项,表明这个职工是在哪个部门工作的。职工关系中的部门号属性和部门关系中的部门号属性相对应,职工关系中部门号则是外键。

从上述说明可以看到:在职工关系中部门号一项,要么取空值,表示这个职工还未分配到任何一个部门工作;要么取值必须和部门关系中某个元组的部门号相同,表示这个职工分配到某个部门工作,这就是参照完整性。上例中若是教职工关系中某个职工的部门号取值不能与部门关系中任何一个元组的部门号一致,表示这个职工被分配到不属于这个单位的部门工作,这与实际应用环境是不相符的,显然是错误的。这就是为什么关系模型中定义了参照完整性约束规则。

在参照完整性定义中,还注明R,S不一定是不同的关系。再给出一个同一关系的实例:若有教职工关系(职工号,职工名,系主任-职工号,工资),其中职工号是主键。系主任的职工号是外键,它与本关系中主键职工号相对应,系主任职工号的取值要么为空值,表示这个系还未任命主任;要么等于职工关系中某个职工号。

实体完整性与参照完整性是由系统自动支持的,即:在建立关系时只要说明了“谁是主键",“谁参照于谁",系统将自动进行此类完整性的检查。

例如,在Oracle系统中,可以用下列语句定义“学生”、“课程”、“学生选课”三个基本表(关系),分别定义学号(sno)是学生表的主键,课程号(cno)是课程表的主键,而学号、课程号(sno、cno)是学生选课表中的外键,分别参考学生表、课程表中的sno、cno主键。其取值要么是空,要么取学生表、课程表中对应的学号值、课程号值。

3.用户定义完整性

除实体完整性和参照完整性之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件,这就是用户定义的完整性约束条件。

用户定义的完整性规则是针对某一应用环境的完整性约束条件,它反映了某一具体应用所涉及的数据应满足的语义要求。系统提供定义和检验这类完整性规则的机制,其目的是用统一的方式由系统来处理它们,不要用应用程序来完成这项工作。

在实际系统中,这类完整性规则一般在建立表的同时进行定义,应用程序人员不需要考虑。如果在建立表时没有定义某些约束条件,则应用编程人员应在各模块的具体编程中通过程序进行检查和控制。

例如,在第1章中定义的实体“学生”中,假如规定学生的年龄必须小于35岁,则必须使用用户定义的完整性约束。由于不同的数据库管理系统提供的定义和检验这类完整性规则的机制不同,这里按Oracle系统提供的定义机制举例,在建立“学生”基本表时使用下列语句定义用户定义的完整性。

上述语句中PRIMARY KEY表示sno是该表的主键,则sno列的值不能是空。CHECK(age>0 and age<35)定义了用户定义的完整性,规定学生的年龄必须在0~35岁之间。如果输入的年龄不在该范围内,则不允许输入。

2.2.2 关系模式

关系数据库同样具有三层模式:概念模式、存储模式和外模式。

1.关系概念模式

关系概念模式主要包括对出现在数据库中的每个关系的说明,即基本表(关系)的说明,它包括对关系名、属性名、属性的取值范围、类型及模式的主键外键等完整性约束的说明。在关系数据模型中,关系与关系之间的联系是通过定义联结字段,即参照完整性的外键与主键来说明的,不必单独说明关系与关系之间的联系。

例如,前面的例子中创建学生关系、课程关系、选课关系时没有单独说明它们之间的联系,但定义了主键和外键,在选课关系中定义了联结字段sno、cno,建立了与学生关系与课程关系之间的联系。

2.关系存储模式

关系存储模式的基本组织方式是文件,元组是文件中的记录。如果关系模式有主键,则存储一个关系时可以用散列方法或索引方法实现。一般基于主关键字进行直接存取需要建立一个主索引(唯一索引),通过辅助关键字进行存取需要建立一个辅助索引。

在关系存储模式中不用说明存储文件,存储文件的说明由关系数据库管理系统根据基本表的定义自动映射产生。

3.关系外模式

关系外模式是用户所看到的那部分数据的描述。除了指出用户的数据外,还应指出关系概念模式与关系外模式之间的对应性。在关系数据库中,关系外模式被称为视图(View)。视图不存储数据,是虚表,其数据来自其他的基本表或视图。

例如,在Oracle系统中,下列语句可以建立一个视图,查看某一学生所学的某一课程的成绩。该外模式grade与基本关系student、course、studentcourse之间通过主键和外键的对应关系建立联结,该外模式的数据来自三张基本表。

2.2.3 关系数据语言

2.2.3.1 关系数据库

关系数据库是指数据库结构的描述。在关系模型中,实体及实体间的联系都是用关系来表示的,在一个给定的应用领域中,所有表示实体及实体之间联系的关系的集合构成一个关系数据库。

2.2.3.2 关系数据语言

关系数据语言按照完成的功能可分为三类:数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)。

DDL负责数据库的描述,提供一种数据定义机制,用来描述数据库的特征或数据的逻辑结构。

DML负责数据库的操作,提供一种数据处理操作的机制。DML语言包括数据查询和数据的增、删、改等功能,其中查询的表达方式是DML的主要部分。

DCL负责控制数据库的完整性和安全性,提供一种检验完整性和保证安全的机制。

关系数据语言按照表达查询的方式不同(理论基础的不同)可以分为两大类:关系代数语言和关系演算语言。用对关系的集合运算来表达查询方式的语言,称为关系代数语言;用谓词演算来表达查询方式的语言,称为关系演算语言。关系代数和关系演算被证明是完全等价的。

关系代数和关系演算均是抽象的查询语言,是实际DBMS软件产品中实现的具体查询语言的理论基础。

另外还有一种结构化查询语言(Structured Query Language,SQL),是介于关系代数和关系演算之间的一种语言,SQL不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集DDL、DML、DCL为一体的标准的关系数据库语言。

因此,关系数据语言按照表达查询的方式不同可以分为三类:关系代数语言(如ISBL)、关系演算语言(如APLHA)、具有关系代数与关系演算双重特点的语言(如SQL)。

关系数据语言的主要优点是其高度的非过程化,用户只需知道做什么,而不需知道怎么做。关系数据语言具有完备的表达能力,功能强,能够嵌入到高级语言中使用。用户不必请求数据库管理员为其建立特殊的存取路径,存取路径的选择是由DBMS自动完成的。

2.3 关系代数

关系代数是以关系为运算对象的一组高级运算的集合。关系代数通过对关系的运算来表达查询,其运算对象是关系,运算结果亦为关系。关系定义为元数相同的元组的集合。关系代数中的运算可分为两类:传统的集合运算和专门的关系运算。下面通过关系代数来说明关系操作是如何实现的。

2.3.1 传统的集合运算

传统的集合运算是二目运算。设关系R和关系S具有相同的元数n(即列数为n),且相应的属性值取自同一个域,则它们之间能进行并、交、差、笛卡尔积运算。

1.并运算(Union)

两个关系R与S的并运算记为R∪S,结果是一个仍为n元的新关系。它由属于R或属于S的元组组成,可形式地定义为:R∪S{t│t∈R∨t∈S},其中t是元组变量,表示关系中的元组。

2.交运算(Intersection)

两个关系R与S的交运算记为R∩S,结果是一个仍为n元的新关系。它由属于R且属于S的元组组成,可形式地定义为:R∩S{t│t∈R∧t∈S},其中t是元组变量,表示关系中的元组。

关系的交运算也可用差运算来表示,即R∩SR-(R-S)。

3.差运算(Difference)

两个关系R与S的差运算记为R-S,结果是一个仍为n元的新关系。它由属于R但不属于S的元组组成,可形式地定义为:R-S{t│t∈R∧not(t∈S)},其中t是元组变量,表示关系中的元组。

4.笛卡尔积(Extended Cartesian Product)

两个分别为n 元和m 元的关系R和S的广义笛卡尔积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有K1个元组,S有K2个元组,则关系R和关系S的广义笛卡尔积有K1*K2个元组。可形式地定义为:R×S{t|t〈tk1,tk2〉∧tk1∈R∧tk2∈S}。

2.3.2 专门的关系运算

专门的关系运算包括选择、投影、联结、除等运算。这类运算不仅涉及行,而且也涉及列。

2.3.2.1 选择运算

选择运算(Selection)是从指定的关系中选择某些元组形成一个新的关系,被选择的元组满足某个逻辑条件。即从关系R中选取使逻辑表达式F为真的元组,这是从行的角度进行的运算,是对一个关系进行水平分割。选择运算是一目关系运算,可形式地定义为:σF(R){t│t∈R∧F(t)true}。

其中:R是关系名,σ是选择运算符,F是逻辑表达式,用于从关系R中筛选满足限定条件的元组。F由逻辑运算符∧、∨、┐与算术比较运算符<、≤、>、≥、≠,以及常量和属性名或属性序号组成的表达式。

2.3.2.2 投影运算

选择运算是从某个关系中选取一个“行"的子集,而投影运算(Projection)实际上是生成一个关系的“列"的子集,它从给定的关系中保留指定的属性子集而删去其余属性。投影操作是在关系中选择某些属性列,重新安排列的顺序组成新的关系。投影运算是从列的角度进行的运算,是对一个关系进行垂直分割。

设有某关系R(X),X是R的属性集,A是X的一个子集,则R在A上的投影可表示为:пA(R){t[A]│t∈R}。其中:t[A]表示元组在相应A属性中的分量。

2.3.2.3 联结运算

联结(Join)也称为θ联结。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。

其中:A和B分别为R和S上度数相等并可比的属性组;θ为比较运算符。联结运算是从R和S的广义笛卡尔积中选取R关系在A属性组上的值与S关系在B属性组上的值满足比较关系θ的元组。

联结条件中的属性称为联结属性,两个关系中的联结属性应该是可比的,即是同一数据类型,如都是数字型或都是字符型。

联结运算中有两种最为重要也最为常用的联结:一种是等值联结(Equi-Join)、另一种是自然联结(Natural Join)。

(1)等值联结

θ为“="的联结运算称为等值联结。它是从关系R与S的笛卡尔积中选取A、B属性值相等的那些元组。

(2)自然联结

自然联结是一种特殊的等值联结,它要求两个关系中进行比较的分量必须是相同的属性组,并且要在结果中把重复的属性去掉。一般的联结操作是从行的角度进行运算。但自然联结还需要取消重复列,所以是同时从行和列的角度进行运算。

自然联结一般使用在R和S有公共属性的情况中。如果两个关系没有公共属性,那么其自然联结就转化为笛卡尔积运算。

两个关系R和S的自然联结运算用RS表示,具体的计算过程如下:

计算R×S;

设R和S的公共属性是A1,A2……,AK,挑选R×S中满足R·A1S·A1,R·A2S·A2……,R·AKS·AK的那些元组;

从R×S结果中去掉S·A1,S·A2……,S·AK这些列。

即是关系R和S做自然联结得到的结果关系,其联结条件为S·BR·B。去掉重复列S·B。自然联结是最常用的联结操作。

2.3.2.4 除运算

设关系R和S的元数分别为m和n(设m>n>0),那么R÷S是一个(m-n)元的元组集合。R÷S是满足下列条件的最大关系:最大关系中每个元组t与S中每个元组u组成的新元组〈t,u〉必在关系R中。

为了方便起见,假设关系S的属性为关系R中后S个属性。

Tπ1,2……,m-n(R);

W(T×S)-R(计算T×S中不在R的元组);

Vπ1,2……,m-n(W);

R÷ST-V。

即R÷Sπ1,2……,m-n(R)-π1,2……,m-n((π1,2……,m-n(R)×S)-R)。

除运算(Division)是同时从行和列角度进行运算。

前面介绍了4种传统的集合运算和4种专门的关系运算,在这8种关系代数运算中,并、差、笛卡尔积、投影、选择这5种运算为基本的运算,它们组成了关系代数完备的运算集。其他3种运算,即交、联结、除运算都可以用这5种基本运算来表达。

2.3.3 扩充的关系代数运算

在关系R和S做自然联结时,我们选择两个关系在公共属性上值相等的元组构成新关系的元组。

关系R中某些元组有可能在S中不存在公共属性上值相等的元组,造成R中的这些元组的值在操作时被舍弃。由于同样的原因,S中某些元组也有可能被舍弃。

1.外联结

如果关系R和S做自然联结时,把R和S中原该舍弃的元组也保留在新关系中,同时在这些元组新增加的属性上填上空值(Null),这种操作称为“外联结"操作。

2.左外联结

如果关系R和S做自然联结时,只把R中原该舍弃的元组放到新关系中,那么这种操作称为“左外联结"操作。

4.外部并

在定义两个关系的并操作时,要求R和S具有相同的关系模式。如果关系R和S模式不同,构成新关系的属性由R和S的所有属性组成(公共属性只取一次),新关系的元组由属于R或属于S的元组构成,同时元组在新增加的属性上填上空值(Null),那么这种操作称为"外部并"操作。

2.3.4 关系代数表达式示例

在关系代数运算中,将上述介绍的4种传统的集合运算和4种专门的关系运算经过有限次复合的公式称为关系代数表达式。表达式的运算结果仍然是一个关系。可以用关系代数表达式表示各种数据查询操作。

假设教学数据库中有如下三个关系(后面的例子都是针对这三个关系进行运算):

学生关系S(学号S#,姓名SNAME,性别SEX,年龄AGE),

课程关系C(课程号C#,课程名CN,任课教师姓名CT)

学生选课关系SC(学号S#,课程号C#,成绩G)

其中,学生关系中学号S#为主键,课程关系中课程号C#为主键,学生选课关系sc中的学号S#和课程号C#是外键,分别参照学生和课程关系中的主键S#和C#。

例2-4 检索学习课程号为C2的学生学号和成绩。

检索的结果是学生的学号和成绩,所以要做投影运算,从SC关系中投影学号S#和成绩G两列。另外检索的是学习课程号为C2的学生,必须做选择运算。综合选择和投影操作,先对关系SC执行选择操作,然后执行投影操作。

πS#,G(δC#′C2′(SC))

例2-5 检索LIU老师所授课程的课程号、课程名。

因为课程号、教师和课程名是C关系中的属性,所以只需要从C关系中用选择和投影即可实现。

πC#,CN(δCT′LIU′(C))

例2-6 检索年龄大于23岁的男学生的学号与姓名。

因为学号、姓名、性别和年龄都是S关系中的属性,所以只需要从S关系中进行选择和投影即可实现。关系代数表达式如下:

πS#,SN(δAGE>′23′∧SEX′M′(S))

例2-7 检索学号为S3学生所学课程的课程名与任课教师名。

首先可以用选择从SC关系中选取S3学生所学的课程号,因为SC关系中没有课程名和任课教师名,所以必须根据得到的课程号从C关系中得到该课程号所对应的课程名和任课教师名。可以将SC关系和C关系进行自然联结,再对联结结果进行选择和投影操作。关系代数表达式如下:

πCN,T(δS#′S3′∧SC.C#C.C#(SC×C))

或者

πCN,T(δS#′S3′(SCC))

例2-8 检索学习课程号为C2的学生学号和姓名。

因为检索学习课程号为C2的学生信息,所以必须做选择运算。因为检索的结果是学号和姓名,所以必须做投影运算。由于这个查询涉及关系S 中的学号S#、学生姓名SN 和关系SC中的课程号C#,因此先要对这两个关系执行自然联结操作,然后再对自然联结的结果执行选择和投影操作。或者先对SC关系执行选择操作后的结果,再与S关系执行自然联结,然后再对结果执行投影。或者先将关系S和SC做笛卡尔积运算,再对笛卡尔积的结果做选择,选择学习课程号为C2的学生,最后再对结果进行投影操作。关系代数表达式如下:

πS#,SN(δC#′C2′(SSC))

或者

πS#,SN(SδC#′C2′(SC))

或者

πS.S#,SN(δC#′C2′∧S.S#SC.S#(S×SC))

例2-9 检索选修课程号为C2或C4的学生学号。

因为检索的内容是学生号,并且是选修课程号为C2或C4的学生,由于只涉及SC关系,所以需要对SC关系进行投影和选择操作。关系代数表达式如下:

πS#(δC#′C2′∨C#′C4′(SC))

例2-10 检索学号为S3学生所学课程的课程名与任课教师名。

因为任课教师名字在C关系中,学生选修信息在SC关系中,所以必须先对C和SC关系进行自然联结,再对联结结果按学号为S3进行选择,对选择后的结果按课程名和教师名进行投影。关系代数表达式如下:

πCN,T(δS#′S3′∧SC.C#C.C#(SC×C))

或者

πCN,T(δS#′S3′(SCC))

例2-11 检索至少选修两门课程的学生学号。

类似例2-8,首先对SC关系进行自身的笛卡尔积运算。至少选修两门课,表示联结的结果中第2列的值和第5列的值必须不同。同一个学生选修多门课,则联结结果中第1列的学号S#与第4列的S#必须相同。最后按学号S#进行投影。关系代数表达式如下:

π1(δ14∧2≠5(SC×SC))

例2-12 检索选修课程名为DB的学生学号和姓名。

因为课程名只有C关系中有,而学生姓名只有S关系中有,选修DB课程的选修关系只有在SC关系中有,所以必须对三个关系(S、C、SC)进行自然联结运算,然后对联结结果进行选择操作,选择课程名为DB的信息,最后对结果进行投影,取学号和学生姓名这两列。或者对三个关系做笛卡尔积运算,再对笛卡尔积的结果进行选择,最后对结果进行投影操作。关系代数表达式如下:

πS#,SN(δCN′DB′(SSCC))

或者

πS.S#,SN(δCN′DB′∧S.S#SC.S#∧SC.C#C.C#(S×SC×C))

例2-13 检索至少选修课程号为C2和C4的学生学号。

因为检索同时选修C2和C4课程的学生信息,所以将SC关系自身做笛卡尔积运算。要求同时选修C2和C4课程,表示笛卡尔积的结果中第2列值必须为C2,第5列值必须为C4。并且必须是同一个学生,所以笛卡尔积中第1列的值必须与第4列的值相等。最后结果进行投影显示学号S#。表达式中采用属性序号代替属性名。

例2-14 检索不学课程号为C2的学生姓名和年龄。

这里要用到集合差操作。先用投影从S关系中取出全部学生的姓名和年龄,再求出学习C2课程的学生姓名和年龄,最后再对两个结果集进行集合差操作。再求学习C2课程的学生姓名和年龄时,由于学生姓名和年龄必须从S关系中取,但学习C2课程的信息必须从SC关系中取,所以涉及S和SC关系,必须对这两个关系进行自然联结,然后再对学习C2课程进行选择,最后按学生姓名和年龄进行投影。关系代数表达式如下:

πSN,age(S)-πSN,age(δC#′C2′(SSC))

例2-15 检索至少选修LIU老师所授课程中一门课程的女学生的姓名。

因为要检索学生的姓名,所以需要从S关系中取信息。因为涉及LIU老师所讲的课程,所以需要从C关系中取信息。又因为涉及选修LIU老师的课程,所以需要从SC关系中取信息。所以检索涉及S、C、SC三个关系,先对这三个关系进行自然联结,然后对联结的结果进行选择,指定选择条件是性别是女并且教师名字为LIU,最后进行投影操作,显示学生的姓名。关系代数表达式如下:

πSN(δSEX′F′∧CT′LIU′(SSCC))

或者

πSN(δSEX′F′∧CT′LIU′∧S.S#SC.S#∧SC.C#C.C#(S×SC×C))

例2-16 检索WANG同学不学的课程号。

首先用投影操作从C关系中选取所有的课程号,然后求出WANG同学所学的所有课程号,最后对这两个结果集进行集合差操作,即可求得WANG同学不学的课程号。求WANG同学所学的课程号时,因为只有S关系才有学生的姓名,只有SC关系中才有选修信息,所以涉及S和SC关系,必须先对S和SC关系进行自然联结,然后对联结结果按学生姓名是WANG作为条件进行选择,最后按课程号进行投影。关系代数表达式如下:

πC#(C)-πC#(δSN′WANG′∧S.S#SC.S#(S×SC))

或者

πC#(C)-πC#(δSN′WANG′(SSC))

例2-17 检索学习全部课程的学生姓名。

首先用πS#,C#(SC)投影操作从SC关系中选取学生选课情况,然后用πC#(C)投影操作从C关系中选取全部课程信息,学习全部课程的学生学号可以用除操作πS#,C#(SC)÷πC#(C)实现,操作的结果是学习全部课程的学生的学号S#。由于需要取的结果是学生姓名,所以必须根据得到的学号从S关系中取出对应的姓名。可以将关系S与除操作的结果进行自然联结操作,得到的结果按学生姓名进行投影即可。关系代数表达式如下:

πSN(S(πS#,C#(SC)÷πC#(C)))

例2-18 检索所学课程包含学生S2所学课程的学生学号。

首先用πS#,C#(SC)操作从SC关系中选取全部学生的选课情况,然后用πC#(δS#′S2′(SC)操作从SC关系选取S2所学的全部课程。求包含S2所学的全部课程的学生号,可以用除操作实现。关系代数表达式如下:

πS#,C#(SC)÷πC#(δS#′S2′(SC))

例2-19 检索选修LIU老师所教的所有课程的学生号。

首先用投影πS#,C#(SC)从SC关系中选取所有学生选修的所有课程号,然后用选择和投影πC#(δCT′LIU′(C))从C关系中选取LIU老师所讲的所有课程号。求选修LIU老师所讲的所有课程的学生号可以用除操作实现。关系代数表达式如下:

πS#,C#(SC)÷πC#(δCT′LIU′(C))

例2-20 检索全部学生都选修的课程的课程号与课程名。

首先用投影操作πS#(S)从S关系中选取所有的学生号,下一步用投影操作πC#,S#(SC)从SC关系中选取学生的选课信息。涉及包含运算时,应用除运算,“除数"是全部量,即从S中选取的全部学生号为除数。除运算得到的结果是全部学生都选修的课程号。但我们不仅需要检索课程号,而且需要检索课程名,课程名只有在C关系中才有,所以需要根据得到的课程号到C关系中去查找。此时必须将除运算得到的结果与C关系进行自然联结,最后将联结的结果进行投影操作。

例2-21 检索选修课程包含LIU老师所授课程的学生学号。

首先用投影操作从SC关系中选取所有选修课程的学生号和课程号,然后用选择和投影操作从C关系中选取LIU老师所讲的所有课程。因为检索选修LIU老师所讲的全部课程的学生号,所以最后用除运算,除数是LIU老师所讲的全部课程。关系代数表达式如下:

πS#,C#(SC)÷πC#(δCT′LIU′(C))

从以上例子可以说明:当查询涉及否定时,需要用集合的差操作来实现,当查询涉及包含全部值时,需要用除运算来实现。

小结

关系运算理论是关系数据库查询语言的理论基础。只有掌握了关系运算理论,才能深刻理解查询语言的本质和熟练使用查询语言。

本章介绍关系模型的基本概念、数学定义。关系的定义及关系必须满足的一些规范化标准。关系定义为元组的集合。关系模型由数据结构、关系操作、关系完整性约束三部分组成。关系模型必须遵循实体完整性规则、参照完整性规则和用户定义的完整性规则。最后详细地介绍关系代数的几种运算,以及这些运算的组合,并且举例说明如何根据查询语句写出关系代数表达式,以及如何求出关系代数表达式的结果。

关系代数的四个传统集合运算、四个专门关系运算,以及扩充的关系运算是本章的重点。其中并、差、笛卡尔积、投影、选择这5种运算为基本的运算,它们组成关系代数完备的运算集。其他3种运算,即交、联结、除运算都可以用这5种基本运算组合而成。

学完本章后要求读者能进行下列两方面工作:一是给定关系和关系代数表达式,求出表达式的结果;二是根据查询语句写出关系代数表达式的表示形式。

习题

1.叙述笛卡尔积、等值联结、自然联结三者之间的区别。

2.叙述关系模型的三个组成部分。

3.叙述关系模型的完整性规则。举例说明关系参照完整性的含义。

5.设有三个关系:

S(S#,SNAME,AGE,SEX)——学生信息(学号、姓名、年龄、性别)

SC(S#,C#,GRADE)——学生选课信息(学号、课程号、成绩)

C(C#,CNAME,TEACHER)——课程信息(课程号、课程名称、老师名)

试用关系代数表达式表示下列查询语句。

(1)检索LIU老师所授课程的课程号、课程名。

(2)检索年龄大于23岁的男学生的学号与姓名。

(3)检索学号为S3的学生所学课程的课程名与任课教师名。

(4)检索至少选修LIU老师所授课程中一门课的女学生姓名。

(5)检索WANG同学不学的课程号。

(6)检索至少选修两门课程的学生学号。

(7)检索全部学生都选修的课程的课程号与课程名。

(8)检索选修课程包含LIU老师所授全部课程的学生学号。

(9)检索选修课程包含学号S2的学生所选修课程的学号。

(10)检索选修全部课程的学生姓名。