关系运算关系演算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.4 关系运算(二)——关系演算
关系代数是将整个关系看作变元,并以其作为基本运算单位,同时以集合方法为关系运算的理论基础。如果将组成关系的基本成分例如元组或者属性域看作变量,以其作为基本运算单位,同时以数理逻辑中谓词演算为相应关系演算的理论基础,就得到了另外一种形式的关系数据语言——关系演算。
关系演算基于谓词演算。在谓词演算中,如果谓词中的变元是关系中的元组,则得到所谓元组关系演算;如果谓词中的变元是关系中的属性域,则得到所谓域关系演算。这样,关系演算就分为元组关系演算和域关系演算两类。
在 2.4节和2.5节,均以本章 2.3.4节中的关系数据库{S,C,SC}为背景举例。这里S (S#,Sn,Sex,Sa,Sd);C (C#,Cn,P#,Tn);SC (S#,C#,G),其中各个属性的含义见2.3.4节。
2.4.1 元组关系演算
如果在一阶谓词演算表达式中,变量是以元组为演算单位,就称其为元组关系演算(Tuple Relation Calculus),其中元组变量表示关系中的元组,变量取值范围是整个关系。
1. 关系的元组演算表示
(1) 关系与谓词的对应
为了得到关系操作的元组关系演算表达式,需要考虑关系与谓词的联系。
z由关系R确定的谓词P
在数理逻辑中我们知道,关系可用谓词表示,n元关系可以由n元谓词表示。
设有关系R,它有元组(r1,r2,…,r m),定义关系R对应如下一个谓词
P (x1,x2, …,x n)。
当t =(r1,r2, …,r m)属于R时,t为P的成真的真值指派,而其他不在R中的任意元组t则是P 的成假指派。即是说,由关系R定义一个谓词P具有如下性质:
P(t) = T (当t在R中);
P(t) = F (当t不在R中)。
z由谓词P表示关系R
由于关系代数中R是元组集合,一般而言,集合是可以用满足它的某种特殊性质来刻画与表示。如果谓词P表述了关系R中元组的本质特性,就可以将关系R写为:
R={t | P(t)}
这个公式就建立了关系(元组集合)的谓词表示,称之为关系演算表达式。
(2) 元组关系演算表达式
元组关系演算表达式的严格数学描述是由“归纳定义”方式完成的。按照通常的思路,元组演算表达式是由“关系演算公式”组成;“关系演算公式”是由“原子公式”组成。
①原子公式
下述三类称为元组演算原子公式,简称原子公式:
z谓词R(t)是原子公式。
z u(i)θv(j)是原子公式。
z u(i)θa是原子公式。
其中,t =(r1,r2,…,r m)是P的成真指派;u(i)表示元组u的第i个分量,v(j)表示元组v的第j 个分量;a是常量,u(i)θa表示u的第i个分量与常量a有关系θ。
② 关系演算公式
利用原子公式可以递归定义关系演算公式:
z 原子公式是公式。
z 如果φ1,φ2是公式,则φ1∧φ2,φ1∨φ2,φ1→φ2和¬φ1均是公式。
z
如果φ是公式,r 是φ中自由变元,则∃r(φ),∀r(φ)是公式。
z 所有公式由且仅由上述三种方式经过有限次操作生成。
在公式中,各种运算的优先次序规定如下:
z 比较运算符:<、>、≤、≥、=、≠。 z
量词:、∀。
∃z 否定词:¬。
z 合取、析取、蕴含运算符:∧、∨、→。
③ 关系演算表达式
有了公式φ的概念,以公式φ作为特性就构成一个有若干元组组成的集合,即关系R ,这种形式的元组集合就称其为关系演算表达式。关系演算表达式的一般形式为: {t | φ(t)}
其中,φ(t)为公式,t 为φ中出现的自由变元。关系演算表达式也简称为关系表达式或者表达式。
2. 关系操作的元组演算表示
关系操作由5种基本操作,它们在关系代数中分别对应5种基本运算,这5种基本运算可以用一阶谓词演算中的公式表示。
设有关系R 、S ,其谓词表示为R(t)和S(t),此时有
z R S={t | R(t)S(t)};
∪∨z
R – S = (t | R(t)¬S(t)); ∧z
σF (R)= {t | R(t)F} ,其中F 是一个谓词公式; ∧z
(k)ui1,ui2,uik (R)={t |(u)R(u)∏∃…t(1)=u(i1)t(2)=u(i2)t(k)=u(ik)}∧∧∧∧
其中t (k)所表示的元组有k 个分量,而t(i)表示t 的第i 个分量,u(j)表示u 的第j 个分量。
(r+s)R S={t |u v(R(u)S(v)t(1)=u(i1)t(2)=u(i2)
t(r)=u(ir)t(r+1)=v(j1)t(r+2)=v(j2) t(r+s)=v(js))}
×∃∃∧∧∧∧∧∧∧∧∧
例2-20 查询计算机科学系(CS)全体学生
S cs ={t | S(t)∧t[5]= 'CS' }
例2-21 查询年龄大于20岁的学生姓名:
S 20={t | S(t)∧t[4]<20 }
例2-22 查询学生姓名和所在系:
S 1={t (2)| (∃u)(S(u)∧t[1]=u[2]∧t[1]=u[5] )
2.4.2 域关系演算
1. 关系的域演算表示
域关系演算(Domain Relation Calculus)简称为域演算,它是关系演算的另外一种形式。域关系和元组关系演算十分类似,这是因为它们都建立在谓词演算之上;两者又有区别,这
是因为有两点不同:其一是谓词变元的不同,元组演算以元组为变元,域演算以元组的分量即属性域为变元,而在实际上,人们就将关系的属性名视为域变元;其二是元组变元的变化范围为整个关系,而域变元的变化范围是某个属性域。域演算表达式的一般形式为:
{t 1,t 2,…,t k | P(t 1,t 2,…,t k )}
其中,t 1,t 2,…,t k 是域变量,P(t 1,t 2,…,t k )是域演算表达式。
为了揭示域演算表达式的语义,我们同样需要进行递归定义。
(1) 原子公式
下述三类称为域演算原子公式,简称原子公式:
z 如果R(t 1,t 2,…,t k )表示命题“以t 1,t 2,…,t k 为分量的元组在关系R 之中”,则R(t 1,t 2,…,t k )
是原子公式,其中,R 是k 元关系,t i 是t 的第i 个分量;
z t i θC 或者C θt i 是原子公式,其中t i 是元组变量的第i 个分量,C 是常量,θ是算数比较
符;
z t i θ u j 是原子公式,其中,t i 表示元组变量t 的第i 个分量,u j 表示元组变量u 的第j 个分
量,它们之间满足运算θ。
例如 t 1=>u 4表示t 的第一个分量大于等于u 的第四个分量。
(2) 域演算公式
域演算公式(简称为公式)可以递归定义如下:
z 原子公式是公式。
z 如果φ1,φ2是公式,则φ1∧φ2,φ1∨φ2,φ1→φ2和¬φ1均是公式。
z
如果φ1是公式,∃t i (φl ),∀t i (φl )是公式。
z 所有公式由且仅由上述三种方式经过有限次操作生成。
例如φ(x 1,x 2,x 3,x 4,x 5)=S(x 1,x 2,x 3,x 4,x 5)∧(x 5>21)∨¬x 4='M'是一个域演算公式。
域演算公式φ中变量的自由出现与约束出现、公式中自由变量x 的型T(x,φ)以及域演算合法公式、域常量带入公式的规则和公式的解释规则等均与元组演算类似。下面举例说明。
例2-23 设φ=z[Sex](S(x ∃1 x 2 z x 4 22))∧¬z='M',则x 1,x 2,x 4在φ中为自由变量,x 3为约束变量。
例2-24 设φ=x ∃2[Sn ,Sex] y ∀1(C#)(S(x 1,x 2,x 3,x 4,x 5)∧x 5 例2-25 查询所有女生的S#、Sn ,Sex 、Sa 和Sd 。 {x 1[S#]x 2[Sn]x 3[Sex]x 4[Sa]x 5[Sd] | XS(x 1,x 2,x 3,x 4,x 5) ∧x 3='F'} 例2-26 查询所有男生的S#、Sa 。 {x 1[S#]x 2[Sa] | ∃y 1y 2y 3y 4y 5(XS(y 1,y 2,y 3,y 4,y 5))∧x 3='M' ∧y 1=x 1 y ∧4=x 2} 例2-27 查询所有年龄小于20岁的男生的S#、C#和G 。 {x 1[S#]x 2[C#]x 3[G] |y ∃1y 2y 3y 4y 5(XS(y 1,y 2,y 3,y 4,y 5))∧x 3='M'∧y 4<20z ∧∃1z 2z 3 (XSC(z 1z 2z 3)z ∧1=y 1 z ∧2=x 2 z ∧3=x 3)y 2=x 1} 2.4.3 关系运算的安全性 1. 安全性问题的提出 对于任何一个计算机系统来说,它都要受到两个“有限”的制约: z 系统的存储容量是有限的,它不可能存储无限关系。这里所说的“无限关系”是指 元组个数为无限的关系。