MySQL数据库原理及应用(第2版)(微课版)
上QQ阅读APP看书,第一时间看更新

任务1-4 掌握关系代数

【任务分析】

在计算机上存储数据的目的是使用数据,选择好数据的组织形式后,接下来的任务是明确怎样使用数据。

【课堂任务】

理解对关系模型中的数据进行哪些操作。

● 什么是关系代数

● 传统的集合运算

● 关系的选择、投影及连接操作

关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它用关系的运算来表达查询。

运算对象、运算符、运算结果是运算的三大要素。关系代数的运算对象是关系,运算结果亦为关系。关系代数中使用的运算符包括4类:集合运算符、专门的关系运算符、比较运算符和逻辑运算符,见表1.4。

表1.4 关系代数运算符

关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。

其中,传统的集合运算将关系看成元组的集合,其运算是从关系的“水平”方向即行的角度进行的,而专门的关系运算不仅涉及行,而且涉及列。比较运算符和逻辑运算符是用来辅助专门的关系运算进行操作的。

(一)传统的集合运算

传统的集合运算是二目运算,包括并、交、差、广义笛卡儿积4种运算。

设关系R和关系S具有相同的目n(即两个关系都具有n个属性),且相应的属性取自同一个域,则可以定义并、差、交、广义笛卡儿积运算如下。

1. 并(Union)

关系R与关系S的并记作

RS={ttRtS},t是元组变量

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

2. 差(Difference)

关系R与关系S的差记作

RS={ttRtS},t是元组变量

其结果关系仍为n目关系,由属于R而不属于S的所有元组组成。

3. 交(Intersection)

关系R与关系S的交记作

RS={ttRtS},t是元组变量

其结果关系仍为n目关系,由既属于R,又属于S的元组组成。关系的交可以用差来表示,即

R∩S=R−(R−S )

4. 广义笛卡儿积(Extended Cartesian Product)

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

例如,关系RS见表1.5(a)、表1.5(b),则RSRSRSR×S分别见表1.5(c)~表1.5(f)。

表1.5 传统的集合运算

(二)专门的关系运算

专门的关系运算包括选择、投影、连接、除等。

为了叙述方便,先引入几个记号。

● 设关系模式为RA1A2,…,An),它的一个关系设为RtR表示tR的一个元组,tAi]表示元组t中相应于属性Ai上的一个分量。

● 若A={Ai1Ai2,…,Aik},其中Ai1Ai2,…,AikA1A2,…,An中的一部分,则A称为属性列或域列。tA]=(tAi1],tAi2],…,tAik])表示元组t在属性列A上诸分量的集合。50183-00-24-1表示{A1A2,…,An}中去掉{Ai1Ai2,…,Aik}后剩余的属性组。

Rn目关系,Sm目关系。trRtsS50183-00-24-2称为元组的连接,它是一个n+m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组。

● 给定一个关系RXZ),XZ为属性组。定义当tX]=x时,xR中的象集为

Zx={tZ]|tRtX]=x

它表示R中属性组X上值为x的诸元组在Z上分量的集合。

1. 选择(Selection)

选择又称为限制(Restriction),它是在关系R中选择满足给定条件的诸元组,记作

σF(R)={t|tRFt)='真'}

其中,F表示选择条件,它是一个逻辑表达式,取逻辑值为“真”或“假”。逻辑表达式F的基本形式为

X1θY1[ΦX2θY2…]

其中,θ表示比较运算符,它可以是>、≥、<、≤、=或≠;X1Y1是属性名、常量或简单函数,属性名也可以用它的序号(如1,2,…)来代替;Φ表示逻辑运算符,它可以是¬(非)、∧(与)或∨(或);[ ]表示任选项,即[ ]中的部分可要可不要;…表示上述格式可以重复下去。

选择运算实际上是从关系R中选取使逻辑表达式F为真的元组,这是从行的角度进行的运算。

设有一个学生—课程数据库见表1.6,它包括以下内容。

学生关系Student(说明:sno表示学号,sname表示姓名,ssex表示性别,sage表示年龄,sdept表示所在系)

课程关系Course(说明:cno表示课程号,cname表示课程名)

选修关系Score(说明:sno表示学号,cno表示课程号,degree表示成绩)

其关系模式如下。

Student(sno,sname,ssex,sage,sdept)

Course(cno,cname)

Score(sno,cno,degree)

表1.6 学生—课程关系数据库

【例1.4】 查询数学系学生的信息。

σsdept='数学系'(Student)

σ5='数学系'(Student)

结果见表1.7。

表1.7 查询数学系学生的信息结果

【例1.5】 查询年龄小于20岁的学生信息。

σsage<20(Student)

σ4<20(Student)结果见表1.8。

表1.8 查询年龄小于20岁的学生的信息结果

2. 投影(Projection)

关系R上的投影是从R中选择出若干属性列组成新的关系,记作

πAR)={tA]|tR

其中,AR中的属性列。

投影操作是从列的角度进行的运算。投影之后不仅取消了原关系中的某些列,而且可能取消某些元组,因为取消了某些属性列后,就可能出现重复元组,关系操作将自动取消相同的元组。

【例1.6】 查询学生的学号和姓名。

πsno,sname(Student)

π1,2(Student)结果见表1.9。

表1.9 查询学生的学号和姓名结果

【例1.7】 查询学生关系Student中都有哪些系,即查询学生关系Student在所在系属性上的投影。

πsdept(Student)

π5(Student)

结果见表1.10。

表1.10 查询学生所在系结果

3. 连接(Join)

连接也称为θ连接,它是从两个关系的笛卡儿积中选取属性间满足一定条件的元组,记作

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

连接运算中有两种最为重要也最为常用的连接:一种是等值连接;另一种是自然连接。

(1)等值连接:θ为“=”的连接运算称为等值连接,它是从关系RS的笛卡儿积中选取AB属性值相等的那些元组,等值连接为

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

RS={trts|tr∈R∧ts∈S∧trA]=tsB]}

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

【例1.8】 设关系RS分别见表1.11(a)和表1.11(b),一般连接C<E的结果见表1.11(c),等值连接R.B=S.B的结果见表1.11(d),自然连接的结果见表1.11(e)。

表1.11 连接运算举例

4. 除(Division)

给定一个关系RXZ),XZ为属性组。定义当tX]=x时,xR中的象集为

Zx={tZ]|tRtX]=x

它表示R中属性组X上值为x的诸元组在Z上分量的集合。

给定关系RXY)和SYZ),其中XYZ可以为单个属性或属性组,关系R中的Y与关系S中的Y可以有不同的属性名,但必须出自相同的域。RS的除运算得到一个新的关系PX),PR中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集Yx包含SY上投影的集合,记作

R÷S={trX]│trRYxπyS)⊆Yx

其中,YxxR中的象集,x=trX]。

除操作是同时从行和列的角度进行的运算。除操作适合于包含“对于所有的/全部的”语句的查询操作。

【例1.9】 设关系RS分别见表1.12(a)、表1.12(b),R÷S的结果见表1.12(c)。在关系R中,A可以取4个值{a1,a2,a3,a4}。其中,

a1的象集为{(b1,c2),(b2,c3),(b2,c1)}。

表1.12 除运算举例

a2的象集为{(b3,c5),(b2,c3)}。

a3的象集为{(b4,c4)}。

a4的象集为{(b6,c4)}。

S在(BC)上的投影为{(b1,c2),(b2,c3),(b2,c1)}。

显然只有a11的象集(BCa1包含S在(BC)属性组上的投影,因此R÷S={a1}。

5. 关系代数操作举例(强化训练)

在关系代数中,关系代数运算经过有限次复合后形成的式子称为关系代数表达式。对关系数据库中数据的查询操作可以写成一个关系代数表达式,或者说,写成一个关系代数表达式就表示已经完成了查询操作。以下给出利用关系代数进行查询的例子。

设学生—课程数据库中有3个关系。

学生关系:S(Sno,Sname,Ssex,Sage)

课程关系:C(Cno,Cname,Teacher)

学习关系:SC(Sno,Cno,Degree)

(1)查询学习课程号为C3号课程的学生学号和成绩。

πsno,degree(σCno='C3'(SC))

(2)查询学习课程号为C4课程的学生学号和姓名。

πsno,sname(σcno='C4'(S∞SC))

(3)查询学习课程名为maths的学生学号和姓名。

πsno,sname(σcname='maths'(S∞SC∞C))

(4)查询学习课程号为C1或C3课程的学生学号。

πsno(σcno='C1'∨ cno='C3'(SC))

(5)查询不学习课程号为C2的学生的姓名和年龄。

πsname,sage(S)- πsname,sage(σcno='C2'(S∞SC))

(6)查询学习全部课程的学生姓名。

πsname(S∞(πsno,cno(SC)÷πcno(C)))

(7)查询所学课程包括200701所学课程的学生学号。

πsno,cno(SC)÷πcno(σsno='200701'(SC))