1、1,第2章 关系模型,2,上一章介绍了三种主要的数据模型: 层次模型 网状模型 关系模型 其中关系模型简单灵活,并有着坚实的理论基础,已成为当前最流行的数据模型。本章主要讲述: 关系模型的数据结构 关系的定义和性质 关系数据库的基本概念 关系运算,3,2.1 关系模型,关系模型就是用二维表格结构来表示实体及实体之间联系的模型。 关系模型是各个关系的框架的集合,即关系模型是一些表格的格式,其中包括关系名、属性名、关键字等。 例如,教学数据库中教师与课程的关系模型如图2.1所示。 教师关系课程关系C 授课关系SC图2.1 教师课程数据库的关系模型,4,从各个关系的框架中,我们可以很容易看出哪两个关
2、系之间有联系。例如: 教师关系和授课关系有公共的属性“教师号”,则表明这两个关系有联系。 而课程关系和授课关系有公共的属性“课程号”,则表明这两个关系也有联系。 至于元组之间的联系,则与具体的数据有关。只有在公共属性上具有相同属性值的元组之间才有联系。,5,由上例可以看出,在一个关系中可以存放两类信息: 一类是描述实体本身的信息 一类是描述实体(关系)之间的联系的信息 在层次模型和网状模型中,把有联系的实体(元组)用指针链接起来,实体之间的联系是通过指针来实现的。 而关系模型则采用不同的思想,即用二维表来表示实体与实体之间的联系,这就是关系模型的本质所在。 所以,在建立关系模型时,只要把的所有
3、的实体及其属性用关系框架来表示,同时把实体之间的关系也用关系框架来表示,就可以得到一个关系模型。 如上例中的教师课程数据库的关系模型就是这样建立的。,6,2.2 关系的定义,在关系模型中,数据是以二维表的形式存在的,这个二维表就叫做关系。 关系理论是以集合代数理论为基础的,因此,我们可以用集合代数给出二维表的“关系”定义。 为了从集合论的角度给出关系的定义,我们先引入域和笛卡尔积的概念。,7,2.2.1 域(Domain) 域是一组具有相同数据类型的值的集合,又称为值域。(用D表示) 例如整数、实数、字符串的集合。 域中所包含的值的个数称为域的基数(用m表示)。 关系中用域表示属性的取值范围。
4、例如: D1=李力,王平,刘伟 m1=3 D2=男,女 m2=2 D3=47,28,30 m3=3 其中,D1,D2,D3为域名,分别表示教师关系中姓名、性别、年龄的集合。 域名无排列次序,如D2=男,女=女,男,8,2.2.2 笛卡尔积(Cartesian Product) 给定一组域D1,D2,Dn(它们可以包含相同的元素,即可以完全不同,也可以部分或全部相同)。D1,D2,Dn的笛卡尔积为D1D2Dn=(d1,d2,dn)|diDi,i=1,2,n。 由定义可以看出,笛卡尔积也是一个集合。 其中: 1. 元素中的每一个di叫做一个分量(Component),来自相应的域(diDi) 2.
5、 每一个元素(d1,d2,d3,dn)叫做一个n元组(n-tuple),简称元组(Tuple)。但元组不是di的集合,元组的每个分量(di)是按序排列的。如: (1,2,3)(2,3,1)(1,3,2); 而集合中的元素是没有排序次序的,如(1,2,3)=(2,3,1)=(1,3,2)。,9,3. 若Di(i=1,2,n)为有限集,Di中的集合元素个数称为Di的基数,用mi(i=1,2,n)表示,则笛卡尔积D1D2Dn的基数M(即元素(d1,d2,dn)的个数)为所有域的基数的累乘之积,即M= 例如:上述表示教师关系中姓名、性别两个域的笛卡尔积为: D1D2=(李力,男),(李力,女),(王平
6、,男),(王平,女),(刘伟,男),(刘伟,女) 其中: 李力、王平、刘伟、男、女都是分量 (李力,男),(李力,女)等是元组 其基数M=m1m2=3*2=6 元组的个数为6,10,4. 笛卡尔积可用二维表的形式表示。 例如,上述的6个元组可表示成表2.1。表2.1 D1和D2的笛卡尔积 由上例可以看出,笛卡尔积实际是一个二维表,表的框架由域构成,表的任意一行就是一个元组,表中的每一列来自同一域,如第一个分量来自D1,第二个分量来自D2。,11,2.2.3 关系(Relation) 笛卡尔积D1D2Dn的任一子集称为定义在域D1,D2,Dn上的n元关系(Relation),可用R(D1,D2D
7、n)表示 如上例D1D2笛卡尔积的子集可以构成教师关系T1,如下表:,12,几点说明: 1. R为关系名,n称为关系的目或度(Degree)。 当n=1时,称为单元关系。 当n=2时,称为二元关系。 当n=n时,称为n元关系。 如上例为二元关系,关系名为T。,13,2. 该子集中的元素是关系中的元组,用r表示,关系中元组个数是关系的基数。如(李力,男),(王平,女),(刘伟,男)为三个元组,关系的基数为3。 如果一个关系的元组个数是无限的,则称为无限关系; 如果一个关系的元组个数是有限的,则称为有限关系。 由于计算机存储系统的限制,我们一般不去处理无限关系,而只考虑有限关系。 3. 同样可以把
8、关系看成一个二维表。其中, (1)表的框架由域Di(i=1,2,n)构成; (2)表的任意一行对应一个元组; (3)表的每一列来自同一域; (4)域可以相同,为了加以区别,每列起一个名字,称为属性,n目关系有n个属性,属性的名字唯一,属性的取值范围Di(i=1,2,n)称为值域 (5)具有相同关系框架的关系成为同类关系, 例如,有另一个关系T2,如表2.3所示:T1和T2是同类关系。,14,4. 数学上关系是笛卡尔积的任意子集,但在实际应用中关系是笛卡尔积中所取的有意义的子集。例如在表2.1中选取一个子集构成如下关系,显然不符合实际情况在关系模型中,关系可进一步定义为: 定义在域D1,D2,D
9、n(不要求完全相异)上的关系由关系头(Heading)和关系体(Body)组成。 关系头:由属性名A1,A2,An的集合组成,每个属性Ai正好对应一个域Di(i=1,2,n),关系头,也称关系框架,相对固定,是关系的数据结构的描述。 关系体:是指关系结构中的内容或者数据,并非固定不变,它随元组的建立、删除或修改而变化。,15,尽管关系与二维表格、传统的数据文件是非常类似的,但它们之间又有重要的区别。 严格地说,关系是种规范化了的二维表中行的集合,为了使相应的数据操作简化,在关系模型中,对关系作了种种限制,关系具有如下特性: 1. 关系中不允许出现相同的元组。因为数学上集合中没有相同的元素,而关
10、系是元组的集合,所以作为集合元素的元组应该是唯一的。 2. 关系中元组的顺序(即行序)是无关紧要的,在一个关系中可以任意交换两行的次序。因为集合中的元素是无序的,所以作为集合元素的元组也是无序的。根据关系的这个性质,可以改变元组的顺序使其具有某种排序,然后按照顺序查询数据,可以提高查询速度。,2.3 关系的性质,16,3. 关系中属性的顺序是无关紧要的,即列的顺序可以任意交换。交换时,应连同属性名一起交换,否则将得到不同的关系。 例如:关系T1作如下交换时,无任何影响,如下表所示:,17,而作如下交换时,不交换属性名,只交换属性列中的值,则得到不同的关系,如下表:,18,4. 同一属性名下的各
11、个属性值必须来自同一个域,是同一类型的数据。 5. 关系中各个属性必须有不同的名字,不同的属性可来自同一个域,即它们的分量可以取自同一个域。 例如,有如下表中关系,职业与兼职是两个不同的属性,但它们取自同一个域职业教师,工人,辅导员。,19,6. 关系中每一分量必须是不可分的数据项,或者说所有属性值都是原子的,即是一个确定的值,而不是值的集合。属性值可以为空值,表示“未知”或“不可使用”,即不可“表中有表”。满足此条件的关系称为规范化关系,否则称为非规范化关系。 例如,在表2.8中,籍贯含有省、市县两项,出现了“表中有表”的现象,则为非规范化关系,而把籍贯分成省、市县两列,将其规范化,如表2.
12、9所示。表2.8 表2.9,20,2.4.1 候选键与关系键 能唯一标识关系中元组的属性或属性集,则称该属性或属性集为候选键(Candidate Key),也称候选关键字或候选码。如: “学生关系”中的学号能唯一标识每一个学生,则属性学号是学生关系的候选键。 在“选课关系”中,只有属性的组合“学号+课程号”才能唯一地区分每一条选课记录,则属性集“学号+课程号”是选课关系的候选键。,2.4 关系的键,21,下面给出候选键的形式化定义: 设关系R有属性A1,A2,An,其属性集K=(Ai,Aj,Ak),当且仅当满足下列条件时,K被称为候选键:1. 唯一性(Uniqueness):关系R的任意两个不
13、同元组,其属性集K的值是不同的。2.最小性(Minimally):组成关系键的属性集(Ai,Aj,Ak)中,任一属性都不能从属性集K中删掉,否则将破坏唯一性的性质 例如:“学生关系”中的每个学生的学号是唯一的,“选课关系”中“学号+课程号” 的组合也是唯一的。对于属性集“学号+课程号” 去掉任一属性,都无法唯一标识选课记录。,22,如果一个关系中有多个候选键,可以从中选择一个作为查询、插入或删除元组的操作变量,被选用的候选键称为主关系键(Primary Key),或简称为主键、主码、关系键、关键字。 例如,假设在学生关系中没有重名的学生,则“学号”和“姓名”都可作为学生关系的候选键。如果选定“
14、学号”作为数据操作的依据,则“学号”为主关系键。 主关系键是关系模型中的一个重要概念。每个关系必需选择一个主关系键,选定以后,不能随意改变。每个关系必定有且仅有一个主关系键,因为关系的元组无重复,至少关系的所有属性的组合可作为主关系键,通常用较小的属性组合作为主关系键。,23,2.4.2 主属性与非码属性 主属性(Prime Attribute):包含在主码中的的各属性称为主属性。 非码属性(Non-Prime Attribute):不包含在任何候选码中的属性称为非码属性。 在最简单的情况下,一个候选码只包含一个属性,如学生关系中的“学号”,教师关系中的“教师号”。 在最极终端的情况下,所有属
15、性的组合是关系的候选码,这时称为全码(all-key)。,24,下面是一个全码的例子:假设有教师授课关系TCS,分别有三个属性教师(T)、课程(C)和学生(S)。一个教师可以讲授多门课程,一门课程可以为多个教师讲授,同样一个学生可以选听多门课程,一门课程可以为多个学生选听。 在这种情况下,T,C,S三者之间是多对多关系,(T,C,S)三个属性的组合是关系TCS的候选码,称为全码,T,C,S都是主属性。,25,2.4.3 外部关系键 如果关系R2的一个或一组属性X不是R2的主码,而是另一关系R1的主码,则该属性或属性组X称为关系R2的外部关系键或外码(Foreign key)。并称关系R2为参照
16、关系(referencing relation),关系R1为被参照关系(referenced relation)。 例2.1 假设在图1.12所示的教学数据库中增加一个系别关系D,包含两个属性系别(DEPT)和地址(ADDR),“系别”是此关系的主码,而“系别”并不是学生关系和教师关系的主码,所以“系别”是学生关系和教师关系的外部关系键。,26,例2.2 如图1.12所示的选课关系中的“学号”属性与学生关系的主码“学号”相对应,“课程号”属性与课程关系的主码“课程号”相对应,因此,“学号”和“课程号”属性是选课关系的外部关系键。学生关系和课程关系为被参照关系,选课关系为参照关系。由外部关系键的
17、定义可知,被参照关系的主码和参照关系的外码必须定义在同一个域上。 如选课关系中的“学号”与学生关系的主码“学号”定义在同一个域上,“课程号”属性与课程关系的主码“课程号”定义在同一个域上。,27,2.4.4 关系模型的完整性 为了维护数据库中数据与现实世界的一致性,对关系数据库的插入、删除和修改操作必须有一定的约束条件,这就是关系模型的三类完整性: 实体完整性 参照完整性 用户定义的完整性1. 实体完整性(Entity Integrity) 实体完整性是指主关系键的值不能为空或部分为空。 关系模型中的一个元组对应一个实体,一个关系则对应一个实体集。 例如,一条学生记录对应着一个学生,学生关系对
18、应着学生的集合。,28,现实世界中的实体是可区分的,即它们具有某种唯一性标识。与此相对应,关系模型中以主关系键来唯一标识元组。 例如,学生关系中的属性“学号”可以唯一标识一个元组,也可以唯一标识学生实体。 如果主关系键中的值为空或部分为空,即主属性为空,则不符合关系键的定义条件,不能唯一标识元组及与其相对应的实体。这就说明存在不可区分的实体,从而与现实世界中的实体是可以区分的事实相矛盾。因此主关系键的值不能为空或部分为空。 例如,学生关系中的主关系键“学号”不能为空;选课关系中的主关系键“学号+课程号”不能部分为空,即“学号”和“课程号”两个属性都不能为空。,29,2. 参照完整性(Refer
19、ential integrity) 如果关系R2的外部关系键X与关系R1的主关系键相符,则X的每个值或者等于R1中主关系键的某一个值,或者取空值。 在例2.1系别关系中的属性“系别”是学生关系外部关系键。 如图2.2所示,学生关系中某个学生(如s1或s2)“系别”的取值,必须在参照的系别关系中主关系键“系别”的值中能够找到,否则表示把该学生分配到一个不存在的部门中,显然不符合语义。 如果某个学生(如s11)“系别”取空值,则表示该学生尚未分配到任何一个系。否则,它只能取专业关系中某个元组的专业号值。,30,S(学生关系) D(系别关系)图2.2 学生表和系别表,31,在例2.2中,如果按照参照
20、完整性规则,选课关系中的外部关系键“学号”和“课程号”可以取空值或者取被参照关系中已经存在的值。但由于“学号”和“课程号”是选课关系中主属性,根据实体完整性规则,两个属性都不能为空。所以选课关系中的外部关系键“学号”和“课程号”中能取被参照关系中已经存在的值。 实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变性。任何关系数据库系统都应该支持这两类完整性。 除此之外,不同的关系数据库系统由于应用环境的不同,往往还需要一些特殊的约束条件,这就是用户定义完整性。,32,3. 用户定义完整性(User-defined Integrity) 用户定义完整性是针对某一具体关系
21、数据库的约束条件。 它反映某一具体应用所涉及的数据必须满足的语义要求。 例如,属性值根据实际需要,要具备一些约束条件,如选课关系中成绩不能为负数;某些数据的输入格式要有一些限制等关系模型应该提供定义和检验这类完整性的机制,以便用统一的、系统的方法处理它们,而不要由应用程序承担这一功能。,33,2.5.1 关系模式和关系数据库模式 一个关系的属性名的集合R(A1,A2,An)叫做关系模式。其中: R为关系名,A1,A2,An为属性名(i=1,2,n)。 由定义可以看出,关系模式是关系的框架,或者称为表框架,指出了关系由哪些属性构成,是对关系结构的描述。一组关系模式的集合叫做关系数据库模式。,2.
22、5 关系数据库模式与关系数据库,34,关系数据库模式是对关系数据库结构的描述,或者说是对关系数据库框架的描述,也就是前面所讲过的关系头,可以看作是关系的型。与关系数据库模式对应的数据库中的当前值就是关系数据库的内容,称为关系数据库的实例,即前面所讲过的关系体,可以看作是关系的值。 例如,在图1.12所示的教学数据库中,共有五个关系,其关系模式分别为: 学生(学号,姓名,性别,年龄,系别) 教师(教师号,姓名,性别,年龄,系别) 课程(课程号,课程名,课时) 选课(学号,课程号,成绩) 授课(教师号,课程号),35,在每个关系中,又有其相应的数据库的实例例如:与学生关系模式对应的数据库中的实例有
23、如下6个元组:,36,2.5.2 关系数据库 关系数据库是“一组随时间变化,具有各种度的规范化关系的集合”。 因为关系是由关系头和关系体组成的,所以关系数据库也可以看作是一组关系头和关系体的集合。 由此可见,关系数据库也有型和值的概念,其型就是关系数据库模式,相对固定;其值就是关系数据库内容,代表现实世界中的实体,而实体是随着时间不断变化的,所以其值在不同的时刻会有所变化。,37,例如:图1.12所示的教学数据库是五个关系的集合,或者说是五个关系头和五个关系体的集合。 其中,各个关系头相对固定,而关系体的内容,会随时间而变化。 比如,学生和教师的年龄随时间而增长,教师的工资和岗位津贴也会发生变
24、化。,38,关系模型与其他模型相比,最有特色的是它的数据库语言。 这种语言灵活方便、表达能力和功能都很强。 目前关系数据库所使用的语言一般都具有定义、查询、更新和控制一体化的特点,而查询是最主要的部分。 所以说,关系数据库的核心部分是查询,故又称为查询语言,而查询的条件要使用关系运算表达式来表示。 因此,关系运算是设计关系数据语言的基础。 按表达查询的方法不同,关系运算可分为关系代数和关系演算两大类。,2.6 关系代数,39,2.6.1 关系代数的分类及其运算符 关系代数是对关系进行集合代数运算,是基于关系代数的操作语言,称为关系代数语言,简称关系代数。 它是由IBM在一个实验性的系统上实现的
25、,称为ISBL(Information System Base Language)语言。 ISBL的每个语句都类似于一个关系代数表达式。 关系代数的运算对象是关系,运算结果也是关系,关系代数用到的运算符主要包括四类: 集合运算符:(并),-(差),(交),X(广义笛卡尔积); 专门的关系运算符:(选择),(投影),(连接),*(自然连接),(除); 算术比较运算符:(大于),(大于等于),(小于),(小于等于),=(等于),(不等于); 逻辑运算符:(与),(或),(非),40,关系代数的运算按运算符的不同主要分为两类: 传统的集合运算:把关系看成元组的集合,以元组作为集合中元素来进行运算,其
26、运算是从关系的“水平”方向即行的角度进行的。包括并、差、交和笛卡尔积等运算。 专门的关系运算:不仅涉及行运算,也涉及列运算,这种运算是为数据库的应用而引进的特殊运算。包括选取、投影、连接和除法等运算。,41,2.6.2 传统的集合运算 对两个关系的集合运算传统的集合运算是二目运算,是在两个关系中进行的。但是并不是任意的两个关系都能进行这种集合运算,而是要在两个满足一定条件的关系中进行运算。那么,对关系有什么要求呢?下面先看一个定义。 定义2.9 设给定两个关系R、S,若满足: () 具有相同的度n; () R中第i个属性和S中第i个属性必须来自同一个域。则说关系R、S是相容的。 除笛卡尔积外,
27、要求参加运算的关系必须满足上述的相容性定义。,42,1. 并(Union) 关系R和关系S的并由属于R或属于S的元组组成,即R和S的所有元组合并,删去重复元组,组成一个新关系,其结果仍为n目关系。记作:RS=t|tRtS 对于关系数据库,记录的插入和添加可通过并运算实现。 2. 差(Difference) 关系R与关系S的差由属于R而不属于S的所有元组组成,即R中删去与S中相同的元组,组成一个新关系,其结果仍为n目关系。记作:R-S=t|tRtS 通过差运算,可实现关系数据库记录的删除。,43,3. 交(Intersection) 关系R与关系S的交由既属于R又属于S的元组组成,即R与S中相同
28、的元组,组成一个新关系,其结果仍为n目关系。记作:RS=t|tRtS 如果两个关系没有相同的元组,那么它们的交为空。 两个关系的并和差运算为基本运算(即不能用其他运算表达的运算),而交运算为非基本运算,交运算可以用差运算来表示:RS=R-(R-S),44,4. 广义笛卡尔积(Extended Cartesian Product) 两个分别为n目和m目关系R和S的广义笛卡尔积是一个(n+m)列的元组的集合,元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的广义笛卡尔积有k1*k2个元组,记作RS=trts| trR,tsS 关系的广义笛
29、卡尔积可用于两关系的连接操作(连接操作将在一节中介绍)。,45,【例4】 如图2.4(a)、(b)所示的两个关系R与S为相容关系,(c)为R与S 的并,(d)为R与S的交,(e)为R与S的差,(f)为R与S的广义笛卡尔积。 R S(a) (b),46,RS R-S(c) (d) RS (e),47,RS,(f)图2.4 传统的集合运算,48,2.6.3 专门的关系运算 由于传统的集合运算,只是从行的角度进行,而要灵活地实现关系数据库多样的查询操作,必须引入专门的关系运算。在讲专门的关系运算之前,为叙述上的方便先引入几个概念。(1)设关系模式为R(A1,A2,An),它的一个关系为R,tR表示t
30、是R的一个元组,tAi则表示元组t中相应于属性Ai的一个分量。,49,(2)若A=Ai1,Ai2,,Aik,其中Ai1,Ai2,Aik是A1,A2,,An中的一部分,则A称为属性列或域列,则表示A1,A2,,An中去掉Ai1,Ai2,,Aik后剩余的属性组。tA=tAi1,tAi2,tAik表示元组t在属性列A上诸分量的集合。 (3)R为n目关系,S为m目关系,trR, tsS,trts称为元组的连接(concatenation),它是一个n+m列的元组,前n个分量为R的一个n元组,后m个分量为S中的一个m元组。 (4)给定一个关系R(X,Z),X和Z为属性组,定义当tX=x时,x在R中的象集
31、(image set),为Zx=tZ|tR,tX=x,它表示R中的属性组X上值为x的诸元组在Z上分量的集合。,50,1. 选取(Selection) 选取运算是单目运算,是根据一定的条件在给定的关系R中选取若干个元组,组成一个新关系,记作: F(R)=t|tRF(t)为真 其中,为选取运算符,F为选取的条件,它由运算对象(属性名、常数、简单函数)、算术比较运算符( ,=,)和逻辑运算符( )连接起来的逻辑表达式,结果为逻辑值“真”或“假”。 选取运算实际上是从关系R中选取使逻辑表达式为真的元组,是从行的角度进行的运算。,51,以下例题均是以图1.12所示的五个关系为例进行运算。 例2.4 查询
32、计算机系的全体学生。 DEPT=计算机 (S)或 5=计算机 (S)(其中5为DEPT的属性序号) 结果右图所示。,52,例2.5 查询工资高于1000元的男教师。 (SAL1000) (SEX=男) (T) 结果如图所示。 注意:字符型数据的值应该使用单引号括起来,例如,计算机,男。,53,2. 投影(Projection) 投影运算也是单目运算,关系R上的投影是从R中选择出若干属性列,组成新的关系,即对关系在垂直方向进行的运算,从左到右按照指定的若干属性及顺序取出相应列,删去重复元组。记作: A(R)=tA|tR 其中A为R中的属性列,为投影运算符。 从其定义可看出,投影运算是从列的角度进
33、行的运算,这正是选取运算和投影运算的区别所在。选取运算是从关系的水平方向上进行运算的,而投影运算则是从关系的垂直方向上进行的。,54,例2.6 查询教师的姓名及其职称。 TN,TNO,PROF(T)或 2,1,5(T) (其中2,1,5分别为TN、TNO和PROF的属性序号) 结果右图所示 上例表明, 投影运算可以改变 关系的属性次序,55,例2.7 查询教师关系中有哪些系。 DEPT(T) 结果如右图所示 由例2.7可以看出,投影后取消了某些属性列后,就可能出现重复行,应该取消这些完全相同的行。所以投影之后,不但减少了属性,元组也可能减少,新关系与原关系不相容。,56,例2.8 查询讲授C5
34、课程的教师号。 TNO(CNO=C5(TC) 结果如右图所示。 本例中选取运算和投影运算相结合,先在授课表中选取满足条件的元组,再于TNO属性上进行投影。,57,3. 连接(Join) 连接运算是二目运算,是从两个关系的笛卡尔积中选取满足连接条件的元组,组成新的关系。 设关系R(A1,A2,An)及S(B1,B2,Bm),连接属性集X包含于A1,A2,An,及Y包含于B1,B2,Bm,X与Y中属性列数目相等,且相对应属性有共同的域。若Z=A1,A2An/X (/X:去掉X之外的属性) 及W=B1,B2Bm/Y,则 R及S可表示为R(Z,X),S(W,Y) 关系R和S在连接属性X和Y上的连接,就
35、是以RS笛卡尔积中,选取X属性列上的分量与Y属性列上的分量满足给定比较条件的那些元组,也就是在RS上选取在连接属性X,Y上满足条件的子集,组成新的关系。新关系的度为n+m。,58,记作: RS=t rts |trRtsStrXtsY为真XY 其中,是连接运算符,为算术比较运算符,也称连接; XY为连接条件; 为“=”时,称为等值连接; 为“”时,称为大于连接。 连接运算为非基本运算,可以用选取运算和广义笛卡尔积运算来表示: RS=xy(RS),59,在连接运算中,一种最常用的连接是自然连接。 所谓自然连接就是在等值连接的情况下,当连接属性X与Y具有相同属性组时,把在连接结果中重复的属性列去掉。
36、即如果R与S具有相同的属性组Y,则自然连接可记作: R*S=t rts |trRtsStrY=tsY 自然连接是在广义笛卡尔积RS中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。,60,例2.9 如图2.9(a)、(b)所示的两个关系R与S,(c)为R和S的大于连接(CD),(d)为R和S的等值连接(C=D),(e)为R和S的等值连接(R.B=S.B),(f)为R和S的自然连接。R S(a) (b),61,大于连接(CD) 等值连接(C=D)(c) (d),62,等值连接(R.B=S.B) 自然连接 (e) (f)图2.9 连接运算举例,63,结合上例,我们可以
37、看出等值连接与自然连接的区别:1. 等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在同名属性才能进行自然连接。如上例R中的C列和S中的D列可进行等值连接,但因为属性名不同,不能进行自然连接。 2. 等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。如上例R中的B列和S中的B列进行等值连接时,结果有两个重复的属性列B,而进行自然连接时,结果只有一个属性列B。,64,例2.10 查询讲授数据库课程的教师姓名。 TN(CN=数据库(C)*TNO,CNO(TC)*TNO,TN(T)或 TN(TNO(CN=数据库(
38、C)*TC)*TNO,TN(T) 结果如右图所示。,65,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上投影的集合。记作: RS=trX|trRy(S)Yx 其中,Yx为x在R中的象集,x= trX。 除法运算为非基本运算,可以表示为: RS=x(R)x(x(R)SR),66,例2.11 已知关系R和S,如图2.11(a),(b)所示
39、,则RS如图(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上的投影,所以RS=(a1,b2),67,R S RS(a) (b) (c)图2.11,68,除法运算同时从行和列的角度进行运算,适合于包含“全部”之类的短语的查询。
40、例2.12 查询选修了全部课程的学生学号和姓名。 SNO,CNO(SC)CNO(C)*SNO,SN(S),69,关系演算是以数理逻辑中的谓词演算为基础的,通过谓词形式来表示查询表达式。 根据谓词变元的不同,可将关系演算分为元组关系演算和域关系演算。 2.7.1 元组关系演算语言 元组关系演算是以元组变量作为谓词变元的基本对象。 元组关系演算语言的典型代表是E.F.Codd提出的ALPHA语言,这种语言虽然没有实际实现,但较有名气,INGRES关系数据库上使用的QUEL语言,就是在ALPHA语言的基础上研制的。 这里主要介绍ALPHA语言和QUEL语言,2.7 关系演算,70,2.7.1.1 A
41、LPHA语言 ALPHA语言是以谓词公式来定义查询要求的。在谓词公式中存在客体变元,这里称为元组变量。 元组变量是一个变量,其变化范围为某一个命名的关系。 ALPHA语言的基本格式是:(): 操作符有GET,PUT,HOLD,UPDATE,DELETE,DROP等到种。 工作空间是指内存空间,可以用一个字母表示,通常用W表示,也可以用别的字母表示。工作空间是用户与系统的通信区。 目标表用于指定操作(如查询、更新等)出来的结果,它可以是关系名或属性名,一答操作语句可以同时对多个关系或多个属性进行操作。,71,操作条件是用谓词公式表示的逻辑表达式,只有满足此条件的元组才能进行操作,这是一个可选项,
42、缺省时表示无条件执行操作符规定的操作。除此之外,还可以在基本格式上加上排序要求,定额要求等。 下面以教学数据库(图1.12)为例,说明ALPHA语言的使用。 1. 数据查询 (1)简单查询 例 查询所有学生的数据。 GET W (S) GET语句的作用是把数据库中的数据读入内存空间W,目标表为学生关系S,代表查询出来的结果,即所有的学生。 冒号后面的操作条件缺省,表示无条件查询。,72,例2.13 查询所有被选修的课程号码。 GET W (SC.CNO) 目标表为选课关系SC中的属性CNO,代表所有被选修的课程号码,查询结果自动消去重复行。 (2)条件查询 由冒号后面的逻辑表达式给出查询条件,
43、在表达式中可以使用如下三类运算符: 比较运算符:,=等于,; 逻辑运算符:(与),(或),(非) 表示执行次序的括号:() 其中,比较运算符的优先级高于逻辑运算符,可以使用()改变它们的优先级。,73,例2.14 查询计算机系工资高于1000元的教师的姓名和工资。 GET W (T.TN,T.SAL):T.DEPT=计算机T.SAL1000 目标表为教师关系T中的两个属性SN和SAL组成的属性列表。(3)排序查询 例2.15 查询S3同学所选课程号及成绩,并按成绩降序排列。 GET W (SC.CNO,SC.SCORE):SC.SNO=S3DOWN SC.SCORE DOWN表示降序,后面紧跟
44、排序的属性名。 升序排列时使用UP。,74,(4)定额查询 例2.15 查询一名男教师的教师号和姓名。 GET W (1) (T.TNO,T.TN):T.SEX=男 所谓的定额查询就是通过在W后面的括号中加上定额数量,限定查询出元组的个数。 这里(1)表示查询结果中男教师的个数,取出教师表中第一个男教师的教师号和姓名。 排序和定额查询可以一起使用。 例2.16 查询一名男教师的教师号和姓名,并使他的年龄最小。 GET W (1) (T.TNO,T.TN):T.SEX=男 UP T.AGE 此语句的执行过程为:先查询所有男教师的教师号和姓名,再按照年龄由小到大排序,然后找出第一位,也就是年龄最小
45、的男教师。,75,(5)带元组变量的查询 所谓的元组关系演算就是以元组变量作为谓词变元的基本对象,在关系演算的查询操作时,可以在相应的关系上定义元组变量。 元组变量代表关系中的元组,其取值是在所定义的关系范围内变化,所以也称作范围变量Range Variable,一个关系可以设多个元组变量。 例2.17 查询S3同学所选课程号。 RANGE SC X GET W (X.CNO):X.SNO=S3 使用RANGE来说明元组变量,X为关系SC上的元组变量。 如果关系的名字很长,使用起来不方便,这时可以设一个名字较短的元组变量来代替关系名,简化关系名,使操作更加方便。,76,(6)带存在量词的查询
46、例2.18 查询S3同学所选课程名。 RANGE SC X GET W (C.CN):X(C.CNO=X.CNOX.SNO=S3) 注意:操作条件中使用量词时必须用元组变量。例2.19 查询至少选修一门其课时数为80的课程的学生的姓名。 RANGE C CXSC SCX GET W (S.SN):SCX(SCX.SNO=S.SNOCX(CX.CNO=SCX.CNOCX.CT=80),77,此查询涉及三个关系,需要对两个关系(C和SC)作用存在量词,所以用了两个元组变量。 此语句的执行过程为:先查询课时数为80的课程号,再根据找到的课程号在关系SC中查询其对应的学号,然后根据为些学号在关系S中找
47、到对应的学生姓名。例2.20 查询选修全部课程的学生姓名。 RANGE C CXSC SCX GET W (S.SN):CXSCX(XSC.SNO=S.SNOCX.CNO=SCX.CNO),78,(7)库函数查询 库函数也称集函数。用户在使用查询语言时,经常要作一些简单的运算。 例如要统计某个关系中符合某一条件的元组数,或某些元组在某个属性上分量的和、平均值等等。 在关系数据库语言中提供了有关这类运算的标准函数,增强了基本检索能力。 常用的库函数下表所示,79,例2.21 求学号为S1学生的平均分。 GET W (AVG(SC.SCORE):S.SNO=S1 例2.22 求学校共有多少个系 G
48、ET W (COUNT(S.DEPT) COUNT函数自动消去重复行,可计算字段“DEPT“不同值的数目。2. 数据更新 更新操作包括修改、插入和删除。 (1)修改 修改操作使用UPDATE语句实现,具体操作分为以下三步:,80,读数据:使用HOLD语句将要修改的元组从数据库中读到工作空间中; 修改:利用宿主语言修改工作空间中元组的属性; 送回:使用UPDATE语句将修改后的元组送回数据库中。 这里HOLD语句是带上并发控制的GET语句。例2.23 把刘伟教师转到信息系。 HOLD W(T.DEPT):T.TN=刘伟 MOVE 信息 TO W.DEPT UPDATE W 在ALPHA语言中,不允许修改关系的主码,例如不能使用UPDATE语句修改教师表T中的教师号。 如果要修改主码,应该先使用删除操作删除该元组,再插入一条具有新主码值的元组。,