2.3 常用的关系运算

数据库中的查询操作是在实际应用中最常用的基本操作,用户可以从数据库中获得感兴趣的数据。关系代数是一种抽象的查询语言,以集合代数为基础,以关系为运算对象的高级运算。关系运算与传统的运算相同,也是一种运算,包括运算对象、运算符和运算结果三大要素。关系代数的运算对象和运算结果都是关系。下面对关系运算的种类和运算符进行简要描述。

2.3.1 关系运算符和运算种类

1.关系运算符

关系运算的运算符主要包括4类:集合运算符、专门的关系运算符、算术比较运算符和逻辑运算符。下面只是简单罗列上述4类运算符,至于具体的使用方法将在后面章节中进行介绍。

1)集合运算符:∪(并运算)、—(差运算)、∩(交运算)、×(笛卡儿积)。

2)专门的关系运算符:σ(选择)、π(投影)、⋈(连接)、÷(除)。

3)(算术)比较运算符:>(大于)、≥(大于等于)、<(小于)、≤(小于等于)、=(等于)、≠(不等于)。

4)逻辑运算符:﹁(非)、∧(与)、∨(并)。

2.关系运算种类

关系运算的种类可分为两类,即传统的关系运算和专门的关系运算。传统的关系运算将关系看作元组的集合,即关系运算的方向是按照“水平”方向行的角度来进行,而专门的关系运算不仅涉及行,而且涉及列。

(1)传统的集合运算

主要使用传统的集合运算方法,将关系(表)作为行(元组)的集合,从关系(表)的行方向角度进行运算。有时需要两个关系进行运算,如找到两个表中相同的部分,这种运算类似于传统集合运算中的交运算。

传统的集合运算可以实现的基本操作如下。

1)并运算,实现数据的插入和添加。

2)差运算,实现数据记录的删除。

3)修改数据记录的操作,由先删除(差)后插入(并)两个操作实现。

(2)专门的关系运算

专门的关系运算是针对关系数据库环境专门设计的,不仅涉及关系的行(元组或记录),也涉及关系的列(属性)。比较运算符和逻辑运算符实现辅助专门的关系运算符操作。有时需要关系(表)本身进行运算,如果需要显示表中某列的值,就需要利用关系的专门运算中的“投影”。

2.3.2 传统的关系运算

事实上,传统的关系运算属于集合运算,即对两个关系的二目集合运算。传统的关系运算主要包括4种:并、差、交和广义笛卡儿积。

1.并运算

设关系R和关系S具有相同的目n(即两个关系具有n个属性),且相应的属性取自同一个域,则关系R和关系S的并(Union)由属于R或属于S的元组组成。其结果关系的属性数仍为n,记为R∪S。形式化定义

R∪S={t|t∈R∨t∈S}

其中,t表示关系R或S中的元组,即关系R或S中的记录行。

注意:

R∪S的结果集合是R中元组和S中元组合并在一起构成的一个新关系,特别要指出的是,合并后的结果必须要去除重复元组。

【案例2-10】已知关系R和关系S如表2-3和表2-4所示,求关系R和关系S的并集(R∪S)。

表2-3 关系R

表2-4 关系S

关系R和关系S的并集结果如表2-5所示。

表2-5 R∪S结果

2.差运算

设关系R和关系S具有相同的目n(即两个关系具有n个属性),且相应的属性取自同一个域,则关系R和关系S的差(Difference)由属于R但不属于S的元组组成。其结果关系的属性数仍为n,记为R-S。形式化定义

R-S={t|t∈R∧t∉S}

其中,t表示关系R或S中的元组,即关系R或S中的记录行。

【案例2-11】已知关系R和关系S如表2-3和表2-4所示,求关系R和S的差。R-S的结果如表2-6所示。

表2-6 关系R-S

3.交运算

设关系R和关系S具有相同的目n(即两个关系具有n个属性),且相应的属性取自同一个域,则关系R和关系S的交(Intersection)由属于R且属于S的元组组成。其结果关系的属性数仍为n,记为R∩S。形式化定义

R∩S={t|t∈R∧t∈S}

其中,t表示关系R或S中的元组,即关系R或S中的记录行。

【案例2-12】已知关系R和关系S如表2-3和表2-4所示,求关系R和S的交。R∩S的结果如表2-7所示。

表2-7 关系R∩S

4.广义笛卡儿积

设关系R和关系S的属性数分别为r和s。关系R和S的广义笛卡儿积(Extended Cartesian)R×S 是一个(r+s)目的元组集合(即新关系的属性数为:r+s),每个元组前r个分量(属性值)来自关系R的一个元组,后s个分量是关系S的一个元组。关系R和关系S的笛卡儿积记为R×S,其形式化定义

R×S={t|t=<tr,ts>∧tr∈R∧ts∈S}

说明:tr、ts中的r、s为上标,分别表示r个分量和s个分量。若关系R的元组数为k1,关系S的元组数为k2,则关系R和关系S的笛卡儿积的元组数为k1×k2

【案例2-13】已知关系R和关系S如表2-4和表2-8所示,求关系R和S的笛卡儿积。R×S的结果如表2-9所示。

表2-8 关系S

表2-9 R×S结果

关系R和关系S中有相同的属性名“学号”,在计算结果中为了区分,需要在其属性名前标注相应的关系名,如R.学号和S.学号。

注意:在实际的应用,笛卡儿积本身没有多少实际用处,只有两表连接时加上限制条件,才会有实际意义。

2.3.3 专门的关系运算

专门的关系运算主要包括4种:选择运算、投影运算、连接运算和除运算。其中选择运算可以选取符合条件的元组构成新关系;投影运算可选取元组中指定的属性构成新关系;连接运算可选取符合条件的元组串联成新关系;除运算可选取象集符合条件的元组的多个属性构成新关系。

1.选择(Selection)运算

选择运算也称限制(Restriction),是对二维表进行水平分割,也可以理解为对记录(元组)水平方向的选取。选择是在表中选取符合给定条件的元组,记为σF(R)。其中,σ为选择运算符,F表示选择条件,是一个逻辑表达式,F的取值为逻辑值“真”或“假”。

逻辑表达式F的基本形式为:XθY,其中θ表示比较运算,它可以是>、≥、<、≤、=、≠。X和Y表示属性名,或为常量,或为简单函数;属性名可以用它的序号来替代。在基本的选择条件中可以进一步进行逻辑运算,进行求非(﹁)、与(∧)、或(∨)运算。

选择运算是从行的角度进行的运算,也就是从关系R中选取使逻辑表达式F为真的元组,也可以理解为从数据表中选取符合某种条件的记录生成新的关系集合。σF(R)表示从R中选取满足公式F的元组(行或记录)所构成的新关系。其形式化定义如下。

σF(R)={t|t∈R∧F(t)=true}

【案例2-14】在商品信息表(见表2-10)查询出所有产地为“深圳”的商品信息。选择运算σ产地='深圳'(商品信息表)或σ8='深圳'(商品信息表),其结果表2-11所示。

表2-10 商品信息表

表2-11 产地为“深圳”选择结果

【案例2-15】查询商品价格低于500元的商品信息。选择运算σ价格<500(商品信息表)或σ3<500(商品信息表),其结果如表2-12所示。

表2-12 价格低于500选择运算结果

2.投影(Projection)运算

投影运算是对关系(表)进行垂直分割,即对记录(元组)列方向的筛选。

投影(Projection)运算是在一个关系中选取某些属性或列,并重新排列属性的顺序,再删掉重复元组后构成的新关系,是对二维表进行垂直分割,记为πA(R)。其中,π为投影运算符,A为关系R中的属性列。

投影运算的形式化定义如下。

πA(R)={t[A]|t∈R}

【案例2-16】已知商品信息表如2-10所示,查询商品的产地信息。

投影运算π产地(商品信息表)或πg(商品信息表)的结果如表2-13所示。

表2-13 投影“产地”运算结果

【案例2-17】已知商品信息表如2-10所示,查询商品的名称和价格信息。投影π商品名称、价格(商品信息表)或π2.3(商品信息表)的结果如表2-14所示。

表2-14 投影“商品名称”和“价格”运算结果

3.连接(Join)运算

连接又称θ连接,是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。形式化定义如下。

其中,A和B分别为关系R和关系S上度数相同且可比的属性组,θ为比较运算符。连接运算从R和S的笛卡儿积R×S中选取R关系在A属性组上的值与S关系在B属性组上值满足比较关系θ的元组。

连接运算中有两种最常用的连接,一种是等值连接(Equijoin),另一种是自然连接(Natural Join)。

1)等值连接。θ为“=”的连接运算称为等值连接。等值连接从关系R和关系S与广义笛卡儿积中选取A、B属性相等的元组,即等值连接为

2)自然连接。是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。如果关系R和S具有相同的属性组B,则自然连接可记为

注意:一般的连接操作是从行的角度进行运算。但自然连接还需要取消重复列,所以是同时从行和列的角度进行的运算。

【案例2-18】设关系R(见表2-15)和关系S(见表2-16),求和R▷◁S。

表2-15 关系R

表2-16 关系S

R▷◁S的结果如表2-17~表2-19所示。

表2-17 关系

表2-18

表2-19 R▷◁S

自然连接与等值连接的主要区别如下。

1)等值连接中相等的属性可以是相同属性,也可以是不同属性,而自然连接中相等的属性必须是相同的属性。

2)自然连接的连接结果必须去除重复属性,而等值连接的结果不需要去除重复属性。

3)自然连接用于有公共属性的情况。若两个关系没有公共属性,则它们不能进行自然连接,而等值连接无此要求。自然连接在多表数据调用时常用。

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上投影的集合。记作

R÷S={tr[X]trR∧πY(S)⊆YX|}

其中YX为x在R中的象集,x=tr[X]。

除运算一般会对行和列角度进行操作。

除运算的计算可按下列过程进行。

1)将被关系的属性分为象集和结果属性两部分,与除关系相同的属性归于象集,不相同的属性归于结果集。

2)在除关系中,在与被除关系相同的属性(象集属性)上投影,得到除目标数据集。

3)将被除关系分组,将结果属性值相同的元组分为一组。

4)观察每个组,若它的象集属性值中包括除目标数据集,则对应的结果属性值应该属于除法运算结果集,并去掉与原被除关系相同的分组。

【案例2-19】(数据库系统工程师2005年5月试题44),已知关系R(见表2-20)和关系S(见表2-21),求R÷S。

表2-20 关系R

表2-21 关系S

具体计算过程如下。

1)关系R中属性组A、B的取值为{(2,1),(2,2),(3,2)}

(2,1)的象集为{(a,c),(b,d)}。

(2,2)的象集为{(a,d)}。

(3,2)的象集为{(b,d),(b,c)}

2)关系S在属性组C、D上的投影为{(a,c),(b,d)}

3)找出全部属性组A、B象集包含关系S属性组C、D上的投影的取值,即为新关系R÷S,此处通过比较(1)和(2),可以发现只有元组(2,1)的象集包含关系S在属性组C、D上的投影,所以R÷S只有一个元组(2,1),即R÷S运算结果如表2-22所示。

表2-22 R÷S

除的基本运算可以表示为等价关表达式

πA(R)-πAA(R)×S-R)

下面试举几个关系代数综合运算应用的案例。

设商品销售数据库有3个关系:商品关系、售货员关系和售货关系。3个关系的关系模式如下。

商品(商品编号,商品名,产地,价格,等级)

售货员(售货号编号,姓名,性别,年龄)

售货(商品编号,售货员编号,数量)

【案例2-20】查询所有产地为北京的商品信息。

σ产地='北京'(商品)

查询年龄35岁以下男性的售货员编号和姓名。

π售货员编号,姓名σ年龄<35∧性别='男'(售货员))

查询售出商品编号为K006的售货员姓名。

π姓名σ商品编号='K006'(售货▷◁售货员))

讨论思考:

1)交、并、差运算的两个关系必须满足什么条件?

2)除运算的结果表示什么含义?

3)等值连接和自然连接之间的区别是什么?