关系数据库系统是支持关系模型的数据库系统。关系数据库是目前应用最广泛,也是最重要、最流行的数据库。按照数据模型的三个要素,关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。本章主要从这三个方面讲述关系数据库的一些基本理论,包括关系模型的数据结构、关系的定义和性质、关系的完整性、关系代数和关系数据库的基本概念等。
本章内容是学习关系数据库的基础,其中,关系代数是学习的重点和难点。学习本章后,读者应掌握关系的定义及性质、关系键、外部键等基本概念,掌握关系演算语言的使用方法。重点掌握实体完整性和参照完整性的内容和意义、常用的几种关系代数的基本运算等。
2.1 关系模型的数据结构及其形式化定义
关系模型的数据结构非常简单,只包含单一的数据结构—关系。在关系模型中,无论是实体还是实体之间的联系均由单一的结构类型即关系来表示。在第1章1.8.3小节中已经非形式化地介绍了关系模型及其有关基本概念。而关系模型是以集合代数理论为基础的,因此,可以用集合代数给出“关系”的形式化定义。为此,我们先引入域和笛卡儿积的概念。
2.1.1 关系的形式化定义及其有关概念
1.域(Domain)
定义2.1 域是一组具有相同数据类型的值的集合,又称为值域(用D表示)。例如,整数、实数和字符串的集合都是域。
域中所包含的值的个数称为域的基数(用m表示)。在关系中就是用域来表示属性的取值范围的。例如:
D1={李力,王平,刘伟},m1=3;
D2={男,女};m2=2;
D3={18,20,18};m3=3。
其中,D1、D2、D3为域名,分别表示教师关系中姓名、性别和年龄的集合。域名无排列次序,如D2={男,女}={女,男}。
2.笛卡儿积(Cartesian Product)
定义2.2 给定一组域D1,D2,…,Dn(它们可以包含相同的元素,即可以完全不同,也可以部分或全部相同),则D1,D2,…,Dn的笛卡儿积为:
D1×D2×…×Dn={(d1,d2,…,dn)|di∈Di,i=1,2,…,n}。
由定义可以看出,笛卡儿积也是一个集合。其中:
(1)每一个元素(d1,d2,…,dn)中的每一个值di叫做一个分量(Component),分量来自相应的域(di∈Di)
(2)每一个元素(d1,d2,…,dn)叫做一个n元组(n-Tuple),简称元组(Tuple)。但元组不是分量di的集合,元组的每个分量(di)是按序排列的。如,以下三个元组是不同的,(1,2,3)≠(2,3,1)≠(1,3,2)。
(3)若Di(i=1,2,…,n)为有限集,Di中的集合元素个数称为Di的基数,用mi(i=1,2,…,n)表示,则笛卡儿积D1×D2×…×Dn的基数M[即元素(d1,d2,…,dn)的个数]为所有域的基数的累乘之积。
例如,上述表示教师关系中姓名、性别两个域的笛卡儿积为: D1×D2={(李力,男),(李力,女),(王平,男),(王平,女),(刘伟,男),(刘伟,女)} 其中,李力、王平、刘伟、男、女都是分量,(李力,男),(李力,女)等是元组,其基数M=m1×m2=3×2=6,元组的个数为6。
(4)笛卡儿积可用二维表的形式表示。例如,上述笛卡儿积D1×D2中的6个元组可表示成表2.1。
由上例可以看出,笛卡儿积实际是一个二维表,表的框架由域构成,表的任意一行就是一个元组,表中的每一列来自同一个域,如第一列来自D1,第二列来自D2。
3.关系(Relation)
定义2.3 笛卡儿积D1×D2×…×Dn的任一子集称为定义在域D1,D2,…,Dn上的n元关系(Relation),可用R(D1,D2,…,Dn)表示。其中,R表示关系的名字,n是关系的目或度(Degree)。
例如,上例D1×D2笛卡儿积的某个子集可以构成教师关系T1,如表2.2所示。
下面是对定义2.3的几点说明。
(1)在关系R中,当n=1时,称为单元关系。当n=2时,称为二元关系,以此类推。如,上例中的教师关系T1为二元关系。
(2)关系中的每个元素是关系中的元组,通常用t表示,关系中元组个数是关系的基数。如,上例中的教师关系T1中的三个元素(李力,男),(王平,女),(刘伟,男)为三个元组,关系T1的基数为3。
如果一个关系的元组个数是无限的,则称为无限关系;如果一个关系的元组个数是有限的,则称为有限关系。由于计算机存储系统的限制,我们一般不去处理无限关系,而只考虑有限关系。
(3)由于关系是笛卡尔积的子集,因此,也可以把关系看成一个二维表。其中:
① 表的框架由域Di(i=1,2,…,n)构成,即表的每一列对应一个域;
② 表的每一行对应一个元组;
③ 由于域可以相同,为了加以区别,必须对每列起一个名字,称为属性(Attribute),n目关系必有n个属性,属性的名字唯一,属性的取值范围Di(i=1,2,…,n)称为值域;
④ 具有相同关系框架的关系称为同类关系。例如,有另一个关系T2,如表2.3所示。
T1和T2是同类关系。
(4)在数学上,关系是笛卡儿积的任意子集,但在实际应用中,关系是笛卡儿积中所取的有意义的子集。例如,在表2.1中选取一个子集构成如表2.4所示关系,表中关系显然不符合实际情况。
在关系模型中,关系可进一步定义为:
定义2.4 定义在域D1,D2,…,Dn(不要求完全相异)上的关系由关系头(Heading)和关系体(Body)组成。
关系头由属性名A1,A2,…,An的集合组成,每个属性Ai对应一个域Di(i=1,2,…,n)。关系头(关系框架)是关系的数据结构的描述,它是固定不变的。
关系体是指关系结构中的内容或者数据,它随元组的建立、删除或修改而变化。
2.1.2 关系的性质
尽管关系与二维表格、传统的数据文件是非常类似的,但它们之间又有着重要的区别。严格地说,关系是一种规范化了的二维表中行的集合,为了使相应的数据操作简化,在关系模型中,对关系作了种种限制,关系具有如下性质。
(1)列是同质的,即每一列中的分量必须来自同一个域,必须是同一类型的数据。
(2)不同的列可来自同一个域,每一列称为属性,不同的属性必须有不同的名字。例如,设有如表2.5所示的关系,职业与兼职是两个列,它们来自同一个域,职业={教师,工人,辅导员},但这两个列是两个不同的属性,必须给它们起不同的名字“职业”和“兼职”。
(3)列的顺序可以任意交换。但交换时,应连同属性名一起交换,否则将得到不同的关系。如关系T1作(如表2.6所示)的交换时,对它无任何影响。
而作(如表2.7所示)的交换时,不交换属性名,只交换属性列中的值,则得到不同的关系。
(4)关系中元组的顺序(即行序)可任意,在一个关系中可以任意交换两行的次序。因为关系是一个集合,而集合中的元素是无序的,所以作为集合元素的元组也是无序的。根据关系的这个性质,可以改变元组的顺序使其具有某种排序,然后按照顺序查询数据,这样可以提高查询速度。
(5)关系中不允许出现相同的元组。因为数学上集合中没有相同的元素,而关系是元组的集合,所以作为集合元素的元组应该是唯一的。
(6)关系中每一分量必须是不可分的数据项,或者说所有属性值都是原子的,即是一个确定的值,而不是值的集合。属性值可以为空值,表示“未知”或“不可使用”,但不可“表中有表”。满足此条件的关系称为规范化关系,否则称为非规范化关系。
例如,在表2.8中,籍贯含有省、市/县两项,出现了“表中有表”的现象,则为非规范化关系,而应把籍贯分成省、市/县两列,将其规范化,如表2.9所示。
2.1.3 关系模式
在数据库中要区分型和值。关系数据库中,关系模式是型,关系是值。关系模式是对关系的描述,那么一个关系需要描述哪些方面的内容呢?
首先,由于关系是笛卡尔积的子集,该子集中的每一个元素是一个元组,即关系也是元组的集合。因此,关系模式必须指出这个元组集合的结构,即它由哪些属性构成,每个属性的名称是什么,这些属性来自哪些域,以及属性与域之间的映像关系。
其次,一个关系通常是由赋予它的元组语义来确定的。即凡是笛卡尔积集合中的所有符合元组语义的那部分元素的全体就构成了该关系模式的关系。现实世界随着时间在不断地变化,因而在不同的时刻,关系模式的关系也会有所变化。但是,现实世界的许多事实限定了关系模式所有可能的关系必须满足一定的完整性约束条件。这些约束条件或者通过属性取值范围的限定,例如,教师的年龄小于65岁(65岁以后必须退休),或者通过属性值间的相互关联(主要体现于值的相等与否)反映出来。关系模式应当刻画出这些完整性约束条件。
因此,一个关系模式应当是一个五元组。
定义2.5 关系的描述称为关系模式(Relation Schema)。它可以形式化地表示为:
R(U,D,DOM,F)
其中,R为关系名;U为组成该关系的属性名集合;D为属性组U中属性所来自的域;DOM为属性向域的映像集合;F为属性间数据的依赖关系集合。在书写过程中,一般用下划线表示出关系中的主码。
由于属性间的数据依赖F将在第4章中进行讨论,而域名D及属性向域的映像DOM常常直接说明为属性的类型、长度。因此,关系模式通常还可简记为:
R(U)或R(A1,A2,…,An)
其中,R为关系名;U为属性名的集合;A1,A2,…,An为各属性名。
由定义可以看出,关系是关系模式在某一时刻的状态或内容。也就是说,关系模式是型,即关系头;而关系是它的值,即关系体。关系模式是关系的框架(或者称为表框架),是对关系结构的描述,它是静态的、稳定的;而关系是动态的、随时间不断变化的,它是关系模式在某一时刻的状态或内容,这是因为关系的各种操作在不断地更新着数据库中的数据。但在实际中,常常把关系模式和关系统称为关系,读者可以通过上下文加以区别。
2.1.4 关系数据库与关系数据库模式
在关系模型中,实体以及实体间的联系都是用关系来表示的。例如,学生实体、课程实体、学生与课程之间的多对多联系都可以分别用一个关系来表示。在一个给定的应用领域中,所有实体以及实体之间联系所对应的关系的集合构成一个关系数据库。
关系数据库也是有型和值之分的。
关系数据库的型称为关系数据库模式,是对关系数据库的描述,它包括若干域的定义以及在这些域上定义的若干关系模式。因此,关系数据库模式是对关系数据库结构的描述,或者说是对关系数据库框架的描述。
而关系数据库的值也称为关系数据库,是这些关系模式在某一时刻对应的关系的集合。也就是说,与关系数据库模式对应的数据库中的当前值就是关系数据库的内容,称为关系数据库的实例。
2.2 关系的码与关系的完整性
2.2.1 候选码与主码
1.候选码(Candidate Key)
能唯一标识关系中元组的一个属性或属性集,称为候选码,也称候选关键字或候选键。如“学生关系”中的学号能唯一标识每一个学生,则属性“学号”是学生关系的候选键。在“选课关系”中,只有属性的组合“学号+课程号”才能唯一地区分每一条选课记录,则属性集“学号+课程号”是选课关系的候选码。
下面给出候选码的形式化定义。
定义2.6 设关系R有属性A1,A2,…,An,其属性集K=(Ai,Aj,…,Ak),当且仅当满足下列条件时,K被称为候选码。
(1)唯一性(Uniqueness),关系R的任意两个不同元组,其属性集K的值是不同的。
(2)最小性,组成关系键的属性集(Ai,Aj,…,Ak)中,任一属性都不能从属性集K中删掉,否则将破坏唯一性的性质。
例如“学生关系”中的每个学生的学号是唯一的,“选课关系”中“学号+课程号”的组合也是唯一的。在属性集“学号+课程号”中去掉任一属性,都无法唯一标识选课记录。
2.主码(Primary Key)
如果一个关系中有多个候选码,可以从中选择一个作为查询、插入或删除元组的操作变量,被选用的候选码称为主码,或称为主关系键、主键、关系键、关键字等。
例如,假设在学生关系中没有重名的学生,则“学号”和“姓名”都可作为学生关系的候选码。如果选定“学号”作为数据操作的依据,则“学号”为主码。如果选定“姓名”作为数据操作的依据,则“姓名”为主码。
主码是关系模型中的一个重要概念。每个关系必须选择一个主码,选定以后,不能随意改变。每个关系必定有且仅有一个主码,因为关系的元组无重复,至少关系的所有属性的组合可作为主码,通常用较小的属性组合作为主码。
3.主属性(Prime Attribute)与非主属性(Non-Prime Attribute)
主属性(Prime Attribute):包含在主码中的各个属性称为主属性。
非主属性(Non-Prime Attribute):不包含在任何候选码中的属性称为非主属性(或非码属性)。
在最简单的情况下,一个候选码只包含一个属性,如学生关系中的“学号”,教师关系中的“教师号”。在最极端的情况下,所有属性的组合是关系的候选键,这时称为全码(All-key)。
【例2-1】 假设有教师授课关系TCS,分别有三个属性教师(T)、课程(C)和学生(S)。一个教师可以讲授多门课程,一门课程可以有多个教师讲授,同样一个学生可以选听多门课程,一门课程可以为多个学生选听。在这种情况下,T,C,S三者之间是多对多关系,(T,C,S)三个属性的组合是关系TCS的候选码,称为全码,T,C,S都是主属性。
2.2.2 外码
定义2.7 如果关系R2的一个或一组属性X不是R2的主码,而是另一关系R1的主码,则该属性或属性组X称为关系R2的外码(Foreign key)或外部关系键,并称关系R2为参照关系(Referencing Relation),关系R1为被参照关系(Referenced Relation)。
【例2-2】 假设在第1章中的图1-22所示的教学数据库中增加一个“系别”关系D,关系D包含两个属性:系别(Dept)和地址(Addr),“系别”是此关系的主码,而“系别”并不是学生关系和教师关系的主码,所以“系别”是学生关系和教师关系的外码。
【例2-3】 第1章中的图1-22所示的选课关系中,“学号”属性与学生关系的主码“学号”相对应,“课程外号”属性与课程关系的主码“课程号”相对应。因此,“学号”和“课程号”属性是选课关系的码。学生关系和课程关系为被参照关系,选课关系为参照关系。
由外码的定义可知,被参照关系的主码和参照关系的外码必须定义在同一个域上。如选课关系中的属性“学号”与学生关系的主码“学号”要定义在同一个域上,“课程号”属性与课程关系的主码“课程号”要定义在同一个域上。
2.2.3 关系的完整性
为了维护关系数据库中数据与现实世界的一致性,对关系数据库的插入、删除和修改操作必须有一定的约束条件,这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束。
关系模型中,有三类完整性约束,即实体完整性、参照完整性和用户自定义的完整性。其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变性。任何关系数据库系统都应该支持这两类完整性。除此之外,不同的关系数据库系统由于应用环境的不同,往往还需要一些特殊的约束条件,这就是用户自定义完整性,用户自定义完整性体现了具体领域中的语义约束。
1.实体完整性(Entity Integrity)
实体完整性是指主关系键的值不能为空或部分为空。
关系模型中的一个元组对应一个实体,一个关系则对应一个实体集。例如,一条学生记录对应着一个学生,学生关系对应着学生的集合。现实世界中的实体是可区分的,即它们具有某种唯一性标识。与此相对应,关系模型中以主关系键来唯一标识元组。例如,学生关系中的属性“学号”可以唯一标识一个元组,也可以唯一标识学生实体。如果主关系键中的值为空或部分为空,即主属性为空,则不符合关系键的定义条件,不能唯一标识元组及与其相对应的实体。这就说明存在不可区分的实体,从而与现实世界中的实体是可以区分的事实相矛盾。因此主关系键的值不能为空或部分为空。
例如,学生关系中的主关系键“学号”不能为空,选课关系中的主关系键“学号+课程号”不能部分为空,即“学号”和“课程号”两个属性都不能为空。
2.参照完整性(Referential Integrity)
如果关系R2的外码X与关系R1的主码相符,则X的每个值或者等于R1中主码的某一个值或者取空值。
在例2-2中,学生关系S的“系别”属性与系别关系D的主码“系别”相对应,因此,学生关系S的“系别”属性是该关系S的外码,学生关系S是参照关系,系别关系D是被参照关系。如图2-2所示,学生关系中某个学生(如S1或S2)“系别”的取值,必须在参照的系别关系中主码“系别”的值中能够找到,否则表示把该学生分配到一个不存在的部门中,显然不符合语义。如果某个学生(如S11)“系别”取空值,则表示该学生尚未分配到任何一个系;否则,它只能取系别关系中某个元组的系别号值。
再如,在例2-3中,如果按照参照完整性规则,选课关系中的外码“学号”和“课程号”可以取空值或者取被参照关系中已经存在的值。但由于“学号”和“课程号”是选课关系中的主属性,根据实体完整性规则,两个属性都不能为空。所以选课关系中的外部关系键“学号”和“课程号”中只能取被参照关系中已经存在的值。
3.用户自定义完整性(User-defined Integrity)
用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如,属性值根据实际需要,要具备一些约束条件,如选课关系中成绩属性的取值范围在0~100之间;某些数据的输入格式要有一些限制等。关系模型应该提供定义和检验这类完整性的机制,以便用统一的、系统的方法处理它们,而不要由应用程序承担这一功能。
2.3 关系代数
关系模型由关系数据结构、关系操作和关系完整性约束三部分组成。本节重点介绍关系操作及其有关概念。
关系模型中常用的关系操作包括查询操作和更新操作(包括插入、删除和修改)两大部分。从计算机语言角度看,后者是在前者的基础上工作,前者比后者复杂。但前者有理论基础,是主要研究对象,是关系操作中最主要的部分。
关系操作采用集合操作方式,即操作的对象和结果都是集合,这种操作方式也称为一次一集合(set-at-a-time)的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。
早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数和关系演算。关系代数用对关系的运算来表达查询要求。关系演算用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。三种运算语言在表达能力上是等价的。
本节主要介绍关系代数,下一节介绍关系演算。
2.3.1 关系代数的分类及其运算符
关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它是由关系的运算来表达查询的。它是由IBM在一个实验性的系统上实现的一种语言,称为ISBL(Information System Base Language)语言。ISBL的每个语句都类似于一个关系代数表达式。
任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以,运算对象、运算符和运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果也是关系。关系代数用到的运算符主要包括以下4类。
(1)集合运算符:∪(并)、-(差)、∩(交)、×(笛卡儿积)。
(2)专门的关系运算符:(选取)、∏(投影)、∞(连接)、*(自然连接)、÷(除)。
(3)算术比较运算符:>(大于)、≥(大于等于)、<(小于)、≤(小于等于)、=(等于)、≠(不等于)。
(4)逻辑运算符有:∧(与)、∨(或)、┐(非)。
算术比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的,所以,关系代数的运算按运算符的不同主要分为以下两类。
(1)传统的集合运算:该类运算把关系看成元组的集合,以元组作为集合中的元素来进行运算,其运算是从关系的“水平”方向即行的角度进行的。它包括并、差、交和笛卡儿积等运算。
(2)专门的关系运算:该类运算不仅涉及行运算,也涉及列运算,这种运算是为数据库的应用而引进的特殊运算。它包括选取、投影、连接和除法等运算。
从关系代数完备性角度看,关系代数分为以下操作类型。
(1)5种基本操作:并、差、积、选取和投影,构成关系代数完备的操作集。
(2)其他非基本操作:可用以上5种基本操作合成的所有其他操作。
2.3.2 传统的集合运算
对两个关系进行的传统的集合运算是二目运算,是在两个关系中进行的。但是,并不是任意的两个关系都能进行这种集合运算,而是要在两个满足一定条件的关系中进行运算。那么,对关系有什么要求呢?下面先看一个定义。
定义2.8 设给定两个关系R,S,若满足:
(1)具有相同的度n;
(2)R中第i个属性和S中第i个属性必须来自同一个域(列同质)。
则说关系R,S是相容的。
除笛卡儿积运算外,其他的集合运算要求参加运算的关系必须满足上述的相容性定义。
1.并(Union)
关系R和关系S的并由属于R或属于S的元组组成,即R和S的所有元组合并,删去重复元组,组成一个新关系,其结果仍为n目关系。记作:
R∪S = {t | t∈R∨t∈S}
上式中,“∪”为并运算符;t为元组变量;“∨”为逻辑或运算符。
对于关系数据库,记录的插入和添加可通过并运算实现。
2.差(Difference)
关系R与关系S的差由属于R而不属于S的所有元组组成,即R中删去与S中相同的元组,组成一个新关系,其结果仍为n目关系。记作:
R−S = {t | t∈R∧┐t∈S}
上式中,“−”为差运算符;t为元组变量;“∧”为逻辑与运算符;“┐”为逻辑非运算符。
通过差运算,可实现关系数据库记录的删除。
3.交(Intersection)
关系R与关系S的交由既属于R又属于S的元组(即R与S中相同的元组)组成一个新关系,其结果仍为n目关系。记作:
R∩S = {t | t∈R∧t∈S}
上式中,“∩”为交运算符;t为元组变量;“∧”为逻辑与运算符。
如果两个关系没有相同的元组,那么它们的交为空。
两个关系的并和差运算为基本运算(即不能用其他运算表达的运算),而交运算为非基本运算,交运算可以用差运算来表示:
R∩S = R − (R −S)
4.广义笛卡儿积(Extended Cartesian Product)
两个分别为n目和m目的关系R和S的广义笛卡尔积是一个(n+m)列的元组的集合,元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的广义笛卡儿积有k1×k2个元组,记作:
R×S = {tr⌒ts| tr∈R∧ts∈S}
关系的广义笛卡儿积可用于两关系的连接操作(连接操作将在下一节中介绍)。
【例2-4】 如图2-3(a)、(b)所示的两个关系R与S为相容关系,图2-3(c)所示为R与S的并,图2-3(d)所示为R与S的差,图2-3(e)所示为R与S的交,图2-3(f)所示为R与S的广义笛卡儿积。
2.3.3 专门的关系运算
1.选取(Selection)
选取运算是单目运算,是根据一定的条件在给定的关系R中选择若干个元组,组成一个新关系。
选取运算实际上是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算。
【例2-5】 查询计算机系的全体学生。
运算结果如图2-4所示。
【例2-6】 查询工资高于1000元的男教师。 运算结果如图2-5所示。 注意:字符型数据的值应该使用单引号括起来,例如,'计算机','男'。
2.投影(Projection)
投影运算也是单目运算,关系R上的投影是从R中选择出若干属性列,组成新的关系,即对关系在垂直方向进行的运算,从左到右按照指定的若干属性及顺序取出相应列,删去重复元组。
从其定义可看出,投影运算是从列的角度进行的运算,这正是选取运算和投影运算的区别所在。选取运算是从关系的水平方向上进行运算的,而投影运算则是从关系的垂直方向上进行的。
【例2-7】 查询教师的姓名、教师号及其职称。
运算结果如图2-6所示。
例2-7表明,投影运算可以改变关系的属性次序。 【例2-8】 查询教师关系中有哪些系。
运算结果如图2-7所示。
由例2-8可以看出,投影后取消了某些属性列后,就可能出现重复行,应该取消这些完全相同的行。所以投影之后,不但减少了属性,元组也可能减少,新关系与原关系不相容。
【例2-9】 查询讲授C5课程的教师号。
运算结果如图2-8所示。 本例中采用选取运算和投影运算相结合的方式,先在授课表TC中选取满足条件的元组,然后在TNo属性上进行投影。
3.连接(Join)
连接运算是二目运算,是从两个关系的笛卡儿积中选取满足连接条件的元组,组成新的关系。
在连接运算中,一种最常用的连接是自然连接。所谓自然连接就是在等值连接的情况下,当连接属性X与Y具有相同属性组时,把在连接结果中重复的属性列去掉。
自然连接是在广义笛卡儿积R×S中选出同名属性上符合相等条件的元组,再进行投影,去掉重复的同名属性,组成新的关系。
【例2-10】 设有如图2-9(a)与图2-9(b)所示的两个关系R与S,图2-9(c)所示为R和S的大于连接(C>D),图2-9(d)所示为R和S的等值连接(C=D),图2-9(e)所示为R和S的等值连接(R.B=S.B),图2-9(f)所示为R和S的自然连接。
结合上例,我们可以看出等值连接与自然连接的区别。
(1)等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有同名属性才能进行自然连接。如上例R中的C列和S中的D列可进行等值连接,但因为属性名不同,不能进行自然连接。
(2)在连接结果中,等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。如上例R中的B列和S中的B列进行等值连接时,结果有两个重复的属性列B,而进行自然连接时,结果只有一个属性列B。
【例2-11】 查询讲授“数据库”课程的教师姓名。
运算结果如图2-10所示。
4.除法(Division)
除法运算是二目运算,设有关系R(X,Y)与关系S(Y,Z),其中X,Y,Z为属性集合,R中的Y与S中的Y可以有不同的属性名,但对应属性必须出自相同的域。关系R除以关系S所得的商是一个新关系P(X),P是R中满足下列条件的元组在X上的投影:元组在X上分量值x的像集Yx包含S在Y上投影的集合
【例2-12】 已知关系R和S,如图2-11(a)和图2-11(b)所示,则R÷S如图2-11(c)所示。
与除法的定义相对应,本题中X={A,B}={(a1,b2),(a2,b4),(a3,b5)},Y={C,D}={(c3,d5),(c4,d6)},Z={F}={f3,f4}。其中,元组在X上各个分量值的像集分别为:
(a1,b2)的像集为{(c3,d5),(c4,d6)}
(a2,b4)的像集为{(c1,d3)}
(a3,b5)的像集为{(c2,d8)}
S在Y上的投影为{(c3,d5),(c4,d6)}
显然只有(a1,b2)的像集包含S在Y上的投影,所以R÷S={(a1,b2)}
除法运算同时从行和列的角度进行运算,适合于包含“全部”之类的短语的查询。
【例2-13】 查询选修了全部课程的学生学号和姓名。
【例2-14】 查询至少选修了C1课程和C3课程的学生学号。
只有S4同学的像集至少包含了C1课程和C3课程,因此,查询结果为S4。
2.4 小 结
关系数据库系统是目前使用最广泛的数据库系统,本书的重点也是讨论关系数据库系统。本章是在介绍了域和笛卡儿积概念的基础上,给出了关系和关系模式的形式化定义,讲述了关系的性质,指出关系、二维表之间的联系。本章还系统地介绍了关系数据库的一些基本概念,其中包括关系的键、关系模型的数据结构、关系的完整性及其关系操作。结合实例详细介绍了关系代数和关系演算两种关系运算,讲解了关系代数、元组关系演算语言(ALPHA语言、QUEL语言)和域关系演算语言(QBE语言)的具体使用方法。这些概念及方法对理解本书的内容非常重要。