购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 关系代数

关系模型源于数学,关系是由元组构成的集合,可以通过关系的运算来表达查询要求,而关系代数恰恰是关系操作语言的一种传统的表示方式,是一种抽象的查询语言。

关系代数是一种纯理论语言,它定义了一些操作,运用这些操作可以从一个或多个关系中得到另一个关系,而不改变源关系。因此,关系代数的操作数和操作结果都是关系,而且一个操作的输出可以是另一个操作的输入。关系代数同算术运算一样,允许有嵌套的表达式。关系在关系代数下是封闭的,正如数字在算术运算下是封闭的一样。

关系代数是一种单次关系(或者说是集合)语言,即所有元组可能来自多个关系,但是用不带循环的一条语句处理。关系代数命令的语法形式有多种,本书采用的是一套通用的符号表示方法。

关系代数的运算对象是关系,运算结果也是关系。与一般的运算一样,运算对象、运算符和运算结果是关系代数的三大要素。

关系代数的运算可分为以下两大类:

1)传统的集合运算。这类运算完全把关系看成元组的集合。传统的集合运算包括集合的广义笛卡儿积运算、并运算、交运算和差运算。

2)专门的关系运算。这类运算除了把关系看成元组的集合外,还通过运算表达了查询的要求。专门的关系运算包括选择、投影、连接和除运算。

关系代数中的运算符可以分为四类:传统的集合运算符、专门的关系运算符、比较运算符和逻辑运算符。表3-10列出了这些运算符,其中比较运算符和逻辑运算符是配合专门的关系运算符来构造表达式的。

表3-10 关系代数运算符

3.4.1 传统的集合运算

传统的集合运算是二目运算,设关系 R S 均是 n 目关系,且对应的属性值均取自同一个值域,则可以定义三种运算:并运算(∪)、交运算(∩)和差运算(-),但广义笛卡儿积并不要求参与运算的两个关系的对应属性取自相同的域。并、交、差运算示意图如图3-5所示。

图3-5 并、交、差运算示意图

现在以图3-6a、b所示的两个关系为例,说明这三种传统的集合运算。

图3-6 描述顾客信息的两个关系

1.并运算

设关系 R 与关系 S 均是 n 目关系,则关系 R 与关系 S 的并运算记为

R S ={ t | t R t S }

其结果仍是 n 目关系,由属于 R 或属于 S 的元组组成。

图3-7a显示了图3-6a、b两个关系的并运算结果。

2.交运算

设关系 R 与关系 S 均是 n 目关系,则关系 R 与关系 S 的交运算记为

R S ={ t | t R t S }

其结果仍是 n 目关系,由属于 R 并且也属于 S 的元组组成。

图3-7b显示了图3-6a、b两个关系的交运算结果。

3.差运算

设关系 R 与关系 S 均是 n 目关系,则关系 R 与关系 S 的差运算记为

R-S ={ t | t R t S }

其结果仍是 n 目关系,由属于 R 并且不属于 S 的元组组成。

图3-7c显示了图3-6a、b两个关系的差运算结果。

图3-7 集合的并、交、差运算示意图

4.广义笛卡儿积

广义笛卡儿积不要求参加运算的两个关系具有相同的目数。

两个分别为 m 目和 n 目的关系 R 和关系 S 的广义笛卡儿积是一个有( m + n )目的元组的集合。元组的前 m 个列是关系 R 的一个元组,后 n 个列是关系 S 的一个元组。若 R K 1 个元组, S K 2 个元组,则关系 R 和关系 S 的广义笛卡儿积有 K 1 × K 2 个元组,记为

R × S ={ t r ^ t s | t r R t s S }

t r ^ t s 表示由两个元组 t r t s 前后有序连接而成的一个元组。比如,如果 t r =( a 1 a 2 ), t s =( b 1 b 2 b 3 ),则 t r ^ t s =( a 1 a 2 b 1 b 2 b 3 )。

任取元组 t r t s ,当且仅当 t r 属于 R t s 属于 S 时, t r t s 的有序连接即为 R × S 的一个元组。

实际操作时,可从 R 的第一个元组开始,依次与 S 的每一个元组组合,然后,对 R 的下一个元组进行同样的操作,直至 R 的最后一个元组也进行同样的操作为止,即可得到 R × S 的全部元组。

图3-8所示为广义笛卡儿积操作示意图。

图3-8 广义笛卡儿积操作示意图

3.4.2 专门的关系运算

专门的关系运算包括:选择、投影、连接、除等操作,其中选择和投影为一元操作,连接和除为二元操作。

设有表3-11所示的students(学生)关系,各属性含义如下:

SID:学号;sname:姓名;gender:性别;college:所在学院。

表3-11 students

1.选择(selection)

选择运算是从指定的关系中选出满足给定条件(用逻辑表达式表达)的元组而组成一个新的关系。选择运算的功能如图3-9所示。

图3-9 选择运算

选择运算表示为

σ F R )={ t | t R F t )=true}

式中, σ 是选择运算符; R 是关系名; t 是元组; F 是逻辑表达式,取逻辑“真”值或“假”值。

例3-4 对表3-11所示的学生关系,写出从该关系中选择“计算机学院”学生信息的关系代数表达式。

σ college =‘计算机学院’ (students)

该选择运算产生的关系见表3-12。

表3-12 例3-4的选择结果

(续)

2.投影(projection)

投影运算是从关系 R 中选取若干属性,并用这些属性组成一个新的关系。其运算功能如图3-10所示。

图3-10 投影运算

投影运算表示为

A R )={ t . A | t R }

式中,∏是投影运算符; R 是关系名; A 是被投影的属性或属性组; t . A t 这个元组中相对于属性(组) A 的分量,也可以表示为 t [ A ]。

投影运算一般由两个步骤完成:

1)选取指定的属性,形成一个可能含有重复行的新关系。

2)删除重复行,形成结果关系。

例3-5 对表3-11所示的关系,在sname、college两个列上进行投影运算,可以表示为

sname,college (students)

该投影运算产生的关系见表3-13。

表3-13 例3-5的投影结果

3.连接

连接运算用来连接相互之间有联系的两个关系,从而产生一个新的关系。这个过程由连接属性(字段)来实现。一般情况下连接属性是出现在不同关系中的语义相同的属性。连接是由笛卡儿积导出的,相当于把连接谓词看成选择公式。进行连接运算的两个关系通常是具有一对多联系的父子关系。

连接运算主要有以下几种形式:

1)θ连接,θ为比较运算符。

2)等值连接(θ连接的特例)。

3)自然连接。

4)外部连接(简称外连接)。

θ连接运算一般表示为

式中, A B 分别是关系 R 和关系 S 上语义相同的属性或属性组;θ是比较运算符。“ A θ B ”连接运算是从 R S 的广义笛卡儿积 R × S 中,选择关系 R 在属性组 A 上的值与关系 S 在属性组 B 上值满足比较运算符θ的元组。

连接运算中最重要也是最常用的连接有两个,一个是等值连接,一个是自然连接。

当θ为“=”时的连接为等值连接,它是从关系 R 与关系 S 的广义笛卡儿积中选取 A B 属性组值相等的那些元组,即

自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性或属性组,并且在连接结果中去掉重复的属性列,使公共属性列只保留一个。即,若关系 R S 具有相同的属性组 B ,则自然连接可记作

一般的连接运算是从行的角度进行运算,但自然连接还需要去掉重复的列,所以是同时从行和列的角度进行运算。

自然连接与等值连接的区别有以下两点:

1)自然连接要求相等的分量必须有共同的属性名,等值连接无此要求。

2)自然连接要求把重复的属性去掉,等值连接无此操作。

例3-6 设有表3-14所示的“商品”关系和表3-15所示的“销售”关系,分别进行等值连接和自然连接运算。

表3-14 商品

表3-15 销售

等值连接:

自然连接:

等值连接结果见表3-16,自然连接结果见表3-17。

表3-16 例3-6等值连接结果

表3-17 例3-6自然连接结果

从例3-6可以看到,当两个关系进行自然连接时,连接的结果由两个关系中公共属性值相等的元组构成。从连接的结果可以看到,在“商品”关系中,如果某商品(这里是“P03”商品)在“销售”关系中没有出现(即没有被销售过),则关于该商品的信息不会出现在连接结果中。也就是说,在连接结果中会舍弃掉不满足连接条件(这里是两个关系中的“商品号”相等)的元组。这种形式的连接称为内连接。

如果希望不满足连接条件的元组也出现在连接结果中,则可通过外连接(outer join)操作实现。外连接有三种形式:左外连接(left outer join)、右外连接(right outer join)和全外连接(full outer join)。

左外连接的连接形式为

右外连接的连接形式为

全外连接的连接形式为

左外连接的含义是把连接符号左边的关系(这里是 R )中不满足连接条件的元组也保留到连接后的结果中,并在连接结果中将该元组所对应的右边关系(这里是 S )的各个属性均置成空值(NULL)。

右外连接的含义是把连接符号右边的关系(这里是 S )中不满足连接条件的元组也保留到连接后的结果中,并在连接结果中将该元组对应的左边关系(这里是 R )的各个属性均置成空值(NULL)。

全外连接的含义是把连接符号两边的关系( R S )中不满足连接条件的元组均保留到连接后的结果中,并在连接结果中将不满足连接条件的各元组的相关属性均置成空值(NULL)。

“商品”关系和“销售”关系的左外连接表达式为

其连接结果见表3-18。

表3-18 商品和销售的左外连接结果

设有表3-19和表3-20所示的两个关系 R S ,则这两个关系的全外连接结果见表3-21。

表3-19 关系 R

表3-20 关系 S

表3-21 关系 R S 的全外连接结果

4.除(division)

(1)除的简单描述

设关系 S 的属性是关系 R 的属性的一部分,则 R ÷ S 为这样一个关系:

1)此关系的属性是由属于 R 但不属于 S 的所有属性组成。

2) R ÷ S 的任一元组都是 R 中某元组的一部分。但必须符合要求,即任取属于 R ÷ S 的一个元组 t ,则 t S 的任一元组连接后,都是 R 中原有的一个元组。

除运算的示意图如图3-11所示。

图3-11 除运算的示意图

(2)除的一般形式

设有关系 R X Y )和 S Y Z ),其中 X Y Z 为关系的属性组,则

R X Y )÷ S Y Z )= R X Y )÷∏ Y S

(3)确定关系 R ÷ S 元组

关系的除运算是关系运算中最复杂的一种,关系 R S 的除运算的以上叙述解决了 R ÷ S 关系的属性组成及其元组应满足的条件要求,但怎样确定关系 R ÷ S 元组,仍然没有说清楚。为了说清楚这个问题,首先引入一个概念。

象集 :给定一个关系 R X Y ), X Y 为属性组。定义当 t [ X ]= x 时, x R 中的象集(image set)为

Y x ={ t [ Y ]| t R t [ X ]= x }

式中, t [ Y ]和 t [ X ]分别是 R 中的元组 t 在属性组 Y X 上的分量的集合。

例如在表3-11所示的students(SID,sname,gender,college)关系中,有一个元组值为

(202101001,李勇,男,计算机学院)

假设 X ={gender,college}, Y ={SID,sname},则 t [ X ]的一个值为

x =(男,计算机学院)

此时, Y x t [ X ]= x =(男,计算机学院)时所有 t [ Y ]的值,即

Y x ={(202101001,李勇),(202101002,刘晨),(202101005,王立东)}

也就是由计算机学院全体男生的学号、姓名所构成的集合。

又例如,对于表3-22所示的borrow关系:

表3-22 borrow关系

如果 X ={SID}, Y ={ISBN,borrow_time,return_time},则当 X 取“202101001”时, Y 的象集为

Y x ={(9787302505945,2021-10-11 8:45:00,2021-11-6 14:40:00),

(9787302505945,2022-1-4 9:10:00,2022-1-18 15:22:00)}

其表达的语义为:学号是“202101001”的学生的全部借还书记录。

如果 X = {ISBN}, Y = {SID,borrow_time,return_time},则当 X 取“9787302505945”时, Y 的象集为

Y x ={(202101001,2021-10-11 8:45:00,2021-11-6 14:40:00),

(202101001,2022-1-4 9:10:00,2022-1-18 15:22:00),

(202101002,2021-10-15 9:45:00,2021-10-29 13:42:00)

(202101004,2021-10-11 8:45:00,2021-11-2 14:00:00)}

其表达的语义为:书号是“9787302505945”的图书的全部被借阅情况。

现在,我们再回过头来讨论除的一般形式。

设有关系 R X Y )和 S Y Z ),其中 X Y Z 为关系的属性组,则

R ÷ S ={ t r [ X ]| t r R ∧∏ Y S )⊆ Y x }

图3-12给出了一个除运算的例子。

图3-12 除运算示例

图3-12所示除运算的语义为被学号为“202101001”和“202101004”的两位同学借过的图书的ISBN。

3.4.3 关系代数示例

下面以以下三个关系为例,给出一些实现查询要求的关系代数表达式的例子。

students(SID,sname,gender,college),各属性含义为学号、姓名、性别、所在学院。

books(ISBN,bname,category,press,price),各属性含义为图书ISBN、书名、类别、出版社、价格。

borrow(ISBN,SID,borrow_time,return_time),各属性含义为图书ISBN、学号、借书时间、还书时间。

例3-7 查询计算机学院的学生学号和姓名。

SID,sname σ college=‘计算机学院’ (students))

例3-8 查询借过“数据分析思维”图书的学生学号和借书时间。

由于书名信息在books关系中,而学号和借书时间信息在borrow关系中,因此这个查询同时涉及books和borrow两个关系。因此首先应对这两个关系进行自然连接(通过两个关系中的相同属性:ISBN),然后再对连接的结果执行选择(书名=“数据分析思维”)和投影(要查看的属性:“学号”和“借书时间”)操作。具体如下:

也可以写成:

后一种实现形式是首先在books关系中筛选出“数据分析思维”图书的信息(books关系的子集:包含books全部属性的子集),然后再用这个子集与borrow进行自然连接运算(ISBN相等),后一种写法的执行效率会比前一种写法高。

例3-9 查询借过“数据分析思维”图书的学生姓名和所在学院。

这个查询的查询条件和查询列与两个关系有关:books(包含书名)以及students(包含学生姓名和所在学院)。但由于books关系和students关系之间没有可以进行连接的属性(语义相同的属性),因此如果要使books关系和students关系能够进行连接操作,必须要借助关联这两个关系的borrow关系,通过borrow关系中的ISBN可与books关系中的ISBN进行自然连接,并通过borrow关系中的SID可与students关系中的SID进行自然连接,从而实现books关系和students关系之间的关联关系。

具体的关系代数表达式如下:

也可以写成:

例3-10 查询借过“TP”类图书且借书时间在2022年3月1日之后的学生姓名、所在学院、图书书名和借书时间。

这个查询涉及students、books和borrow三个关系,在books关系中可以指定查询条件:图书类别(“TP”类),并可以得到书名信息;从students关系中可以得到学生姓名、所在学院信息;从borrow关系中可以得到借书时间信息。

具体的关系代数表达式如下:

也可以写成:

例3-11 查询没借过价格低于50元的图书的学生姓名和性别,包括没借过图书的学生。

实现这个查询的基本思路是:从全体学生中去掉借过价格低于50元的图书的学生。因此该查询需要用到传统集合运算中的差运算。

具体的关系代数表达式如下:

也可以写成:

例3-12 查询借了全部“Ⅰ”类图书的学生姓名和所在学院。

编写这个查询语句的关系代数表达式的思考过程如下:

1)得到全部“Ⅰ”类图书的ISBN,可通过下述关系代数表达式实现:

ISBN σ category=‘Ⅰ’ (books))

2)得到借了全部“Ⅰ”类图书的学生学号,这个需要用除法运算实现,其关系表达式为

SID,ISBN (borrow)÷∏ ISBN σ category=‘Ⅰ’ (books))

3)根据步骤2)得到的学号,找到对应的学生姓名和所在学院,这可通过将students关系与步骤2)的结果进行自然连接运算,然后再在连接的结果上对学号和所在学院进行投影操作实现。其关系代数表达式为

例3-13 查询出版了全部类型图书的出版社。

编写这个查询语句的关系代数表达式的思考过程与例3-12类似,最终的关系代数表达式为

表3-23总结了关系代数的操作。

表3-23 关系代数操作总结

关系运算的优先级按从高到低的顺序为:投影、选择、乘积、连接和除(同级)、交、并和差(同级)。 URjmh4buK3rwnJEj9ygtiDAjo1WjsW5dblNYJheOiP7FOXXMWKHuGyR+CsetDExZ

点击中间区域
呼出菜单
上一章
目录
下一章
×