4-2-3

来源:百度文库 编辑:神马文学网 时间:2024/04/27 22:17:53


4.2.1 组关系演算
  把数理逻辑的谓词演算引入到关系运算中,就可得到以关系演算为基础的运算。关系演算又可分为元组关系演算和域关系演算,前者以元组为变量,后者以属性(域)为变量,分别简称为元组演算和域演算。
1.元组表达式的表示
(1)一般形式:
  { t | P(t)}
(2)说明:
  t是元组变量,表示一个元数固定的元组;P是公式,在数理逻辑中也称为谓词,也就是计算机语言中的条件表达式。{ t | P(t)}表示满足公式P的所有元组t的集合。
2.原子公式和公式的定义
  在元组表达式中,公式由原子公式组成。
(1)原子公式(Atoms)的三种形式
   ①R(s)。其中R是关系名,s是元组变量。它表示了这样一个命题:“s是关系R的一个元组”。
   ②s[i]θu[j]。其中s和u是元组变量,θ是算术比较运算符,s[i]和u[j]分别是s的第i个分量和u的第j个分量。s[i]θu[j]表示了这样一个命题:“元组s的第i个分量和u的第j个分量之间满足θ关系”。譬如,s[1]   ③s[i]θa或aθu[j]。这里a是常量。“s[i]θa”表示这样一个命题:“元组s的第i个分量值与常量a之间满足θ关系”。譬如,s[4]=3表示元组s的第4个分量值为3。
(2)自由变量和约束变量
   ①在定义关系演算操作时,要用到“自由”(Free)和“约束”(Bound)变量概念。
   ②在一个公式中,如果元组变量未用存在量词或全称量词符号定义,那么称为自由元组变量,否则称为约束元组变量。
   ③约束变量类似于程序设计语言中过程内部定义的局部变量,自由变量类似于过程外部定义的外部变量或全局变量。
(3)公式(Formulas)的递归定义
   ①每个原子是一个公式。其中的元组变量是自由变量。
   ②如果P1和P2是公式,那么┐P1、P1∨P2、P1∧P2和P1P2也都是公式。分别表示下列命题:“P1不是真”,“P1或P2或两者都是真”,“P1和P2都是真”,“若P1为真则P2必然为真”。公式中元组变量的自由约束性质如同在P1和P2中一样,依然是自由的或约束的。
   ③如果P1是公式,那么(s)(P1)和(s)(P1)也都是公式。其中s是公式P1中的自由元组变量;在(s)(P1)和(s)(P1)中称为约束元组变量。这两个公式分别表示下列命题:“存在一个元组s使得公式P1为真”,“对于所有元组s都使得公式P1为真”。公式中其他元组的自由约束性,与P1中一样。
   ④公式中各种运算符的优先级从高到低依次为:θ,,┐,∧和∨,。在公式外还可以加括号,以改变上述优先顺序。
   ⑤公式只能由上述四种形式构成,除此之外构成的都不是公式。
(4)实例:元组关系演算的例子

  已知关系R和S,求下面五个元组表达式的值:
  R1={t|S(t)∧t[1]>2}
  R2={t|R(t)∧┐S(t)}
  R3={t|(u)(S(t)∧R(u)∧t[3]  R4={t|(u)(R(t)∧S(u)∧t[3]>u[1])}
  R5={t|(u)(v)(R(u)∧S(v)∧u[1]>v[2]∧t[1]=u[2]∧t[2]=v[3]∧t[3]=u[1])}
(5)在元组关系演算的公式中,有下列三个等价的转换规则:
  ①P1∧P2等价于┐(┐P1∨┐P2);
   P1∨P2等价于┐(┐P1∧┐P2)。
  ②(s)(P1(s))等价于┐(s)(┐P1(s));
   (s)(P1(s))等价于┐(s)(┐P1(s))。
  ③P1P2等价于┐P1∨P2。
3.关系代数表达式到元组表达式的转换
  可以把关系代数表达式等价地转换到元组表达式。由于所有的关系代数表达式都能用五个基本操作组合而成,因此我们只要把五个基本操作用元组演算表达就行。
(1)实例1
  设关系R和S都是三元关系,那么关系R和S的五个基本操作可直接转化成等价的元组关系演算表达式:
   ①R∪S可用{t|R(t)∨S(t)}表示;
   ②R-S可用{t|R(t)∧┐S(t)}表示;
   ③R×S可用{t|(u)(v)(R(u)∧S(V)∧t[1]=u[1]∧t[2]=u[2]∧t[3]=u[3]∧t[4]=v[1]∧t[5]=v[2]∧t[6]=v[3])}表示;
   ④π2,3(R)可用{t|(u)(R(u)∧t[l]=u[2]∧t[2]=u[3])};
   ⑤σF(R)可用{t|R(t)∧F'}表示,F'是F的等价表示形式。譬如σ2='d'(R)可写成{t|(R(t)∧t[2]='d')}
(2)实例2
  设关系R和S都是二元关系,把关系代数表达式π1,42=3(R×S))转换成元组表达式的过程从里往外进行,如下所述。
   ①R×S可用{t|(u)(v)(R(u)∧S(v)∧t[1]=u[1]∧t[2]=u[2]∧t[3]=v[1]∧t[4]=v[2])}表示。
   ②对于σ2=3(R×S),只要在上述表达式的公式中加上“∧t[2]=t[3]”即可。
   ③对于π1,42=3(R×S)),可得到下面的元组表达式:
   {w|(t)(u)(v)(R(u)∧S(v)∧t[1]=u[1]∧t[2]=u[2]∧t[3]=v[1]∧t[4]=v[2]∧t[2]=t[3]∧w[1]=t[1]∧w[2]=t[4])}
   ④再对上式化简,去掉元组变量t,可得下式:
   {w|(u)(v)(R(u)∧S(v)∧u[2]=v[1]∧w[1]=u[1]∧w[2]=v[2])}
(3)实例3
  用元组表达式表示下面的查询
   ①检索学习课程号为C2课程的学生学号与成绩。
   {t|(u)(SC(u)∧u[2]='C2'∧t[l]=u[1]∧t[2]=u[3])}
   ②检索学习课程号为C2课程的学生学号与姓名。
   {t|(u)(v)(S(u)∧SC(v)∧v[2]='C2'∧u[l]=v[1]∧t[l]=u[1]∧t[2]=u[2])}
   这里u[l]=v[1]是S和SC进行自然连接操作的条件,在公式中不可缺少。
   ③检索至少选修LIU老师所授课程中一门课程的学生学号与姓名。
   {t|(u)(v)(w)(x)(S(u)∧SC(v)∧C(w)∧T(x)∧u[l]=v[1]∧v[2]=w[1]∧w[3]=x[1]∧x[2]='LIU'∧t[l]=u[1]∧t[2]=u[2])}
   ④检索选修课程号为C2或C4的学生学号。
   {t|(u)(SC(u)∧(u[2]='C2'∨u[2]='C4')∧t[l]=u[1])}
   ⑤检索至少选修课程号为C2和C4的学生学号。
   {t|(u)(v)(SC(u)∧SC(v)∧u[2]='C2'∧v[2]='C4'∧u[l]=v[1]∧t[l]=u[1])}
   ⑥检索不学C2课的学生姓名与年龄。
   {t|(u)(v)(S(u)∧SC(v)∧(u[l]=v[1]?v[2]≠'C2')∧t[1]=u[2]∧t[2]=u[3])}
   ⑦检索学习全部课程的学生姓名。
   {t|(u)(v)(w)(S(u)∧C(v)∧SC(w)∧u[l]=w[1]∧v[1]=w[2]∧t[1]=u[2])}
   ⑧检索所学课程包含学号S3所学课程的学生。
   {t|(u)(SC(u)∧(v)(SC(v)∧(v[1]='S3'(w)(SC(w)∧w[1]=u[1]∧w[2]=v[2])))∧t[l]=u[1])} 4.2.2 域关系演算
1.域关系演算表达式
  域关系演算(Domain Relational Calculus)类似于元组关系演算,不同之处是用域变量代替元组变量的每一个分量,域变量的变化范围是某个值域而不是一个关系。可以像元组演算一样定义域演算的原子公式和公式。
(1)原子公式有两种形式。
   ①R(x1…xk),R是一个k元关系,每个xi是常量或域变量。
   ②xθy,其中x、y是常量或域变量,但至少有一个是域变量,θ是算术比较符。
  域关系演算的公式中也可使用∧、∨、┐和等逻辑运算符。也可用(x)和(x)形成新的公式,但变量x是域变量,不是元组变量。
  自由域变量、约束域变量等概念和元组演算中一样,这里不再重复。
(2)域演算表达式是形为{t1…tk∣P(t1,…,tk)}的表达式,其中P(t1,…,tk)是关于自由域变量t1,…,tk的公式。
(3)实例:域关系演算的例子。

  R1={xyz|R(xyz)∧x<5∧y>3}
  R2={xyz|R(xyz)∨(S(xyz)∧y=4)}
  R3={xyz|(u)(v)(R(zxu)∧w(yv)∧u>v)}
2.元组表达式到域表达式的转换
(1)对于k元的元组变量t,可引入k个域变量t1…tk,在公式中t用t1…tk替换,元组分量t[i]用ti替换。
(2)对于每个量词(u)或(u),若u是m元的元组变量,则引入m个新的域变量u1…um。在量词的辖域内,u用u1…um替换,u[i]用ui替换,(u)用(u1)…(um)替换,(u)用(u1)…(um)替换。
(3)实例1。
   ①对于元组表达式。
   {w|(u)(v)(R(u)∧S(v)∧u[2]=v[1]∧w[1]=u[1]∧w[2]=v[2])}
   ②可用上述转换方法转换成域表达式。
   {w1w2|(u1)(u2)(v1)(v2)(R(u1u2)∧S(v1v2)∧u2=v1∧w1=u1∧w2=v2)}
   ③再进一步简化,可消去域变量u1、v1、v2,得到下式。
   {w1w2|(u2)(R(w1u2)∧S(u2w2))}
(4)实例2。
   ①检索学习课程号为C2的学生学号与成绩。
   关系代数:ΠS#,SCOREC#='C2'(SC))
   元组表达式:{t|(u)(SC(u)∧u[2]='C2'∧t[l]=u[1]∧t[2]=u[3])}
   域表达式:{t1t2|(u1)(u2)(u3)(SC(u1u2u3)∧u2='C2'∧t1=u1∧t2=u3)}
   可化简为:{t1t2|(SC(t1'C2't2))}
   ②检索学习课程号为C2的学生学号与姓名。
   关系代数:ΠS#,SNAMEC#='C2'(SSC))
   元组表达式:{t|(u)(v)(S(u)∧SC(v)∧v[2]='C2'∧u[l]=v[1]∧t[l]=u[1]∧t[2]=u[2])}
   域表达式:{t1t2|(u1)(u2)(u3)(u4)(v1)(v2)(v3)(S(u1u2u3u4)∧SC(v1v2v3)∧v2='C2'∧u1=v1∧t1=u1∧t2=u2)}
   可化简为:{t1t2|(u3)(u4)(v3)(S(t1t2u3u4)∧SC(t1'C2'v3))} 4.2.3 关系运算的安全约束和等价性
1.关系运算的安全性
(1)问题的提出
   ①在关系代数中基本操作是并、差、笛尔卡积、投影和选择,没有集合的“补”操作,因而关系代数运算总是安全的。
   ②关系演算则不然,可能会出现无限关系和无穷验证问题。
   例如元组表达式{t|┐R(t)}表示所有不在关系R中元组的集合,这是一个无限关系。验证公式(u)(P1(u))为假时,必须对所有可能的元组u进行验证,当所有的u都使P1(u)为假时,才能断定公式(u)(P1(u))为假。
   验证公式(u)(P1(u))也是这样,当所有可能的u使P1(u)为真时,才能断定公式(u)(P1(u))为真。
   这在实际上是行不通的。因为,一方面计算机的存储空间是有限的,不可能存储无限关系;另一方面,在计算机上进行无穷验证是永远得不到结果。我们必须采取措施,防止无限关系和无穷验证的出现。
(2)定义
  在数据库技术中,不产生无限关系和无穷验证的运算称为安全运算,相应的表达式称为安全表达式,所采取的措施称为安全约束。
(3)说明
  在关系演算中,我们约定,运算只对表达式中公式涉及到的关系值范围内操作,这样就不会产生无限关系和无穷验证问题,关系演算是安全的。
2.关系运算的等价性
   ①并、差、笛尔卡积、投影和选择是关系代数最基本的操作,并构成了关系代数运算的最小完备集。已经证明,在这个基础上,关系代数、安全的元组关系演算、安全的域关系演算在关系的表达和操作能力上是完全等价的。
   ②关系运算主要有关系代数、元组演算和域演算三种,相应的关系查询语言也已研制出来,它们典型的代表是ISBL语言、QUEL语言和QBE语言。
   ③ISBL(Information System Base Language)是IBM公司英格兰底特律科学中心在1976年研制出来的,用在一个实验系统PRTV (Peterlee Relational Test Vehicle)上。ISBL语言与关系代数非常接近,每个查询语句都近似于一个关系代数表达式。
   ④QUEL语言(Query Language)是美国伯克利加州大学研制的关系数据库系统INGRES的查询语言,1975年投入运行,并由美国关系技术公司制成商品推向市场。QUEL语言是一种基于元组关系演算的并具有完善的数据定义、检索、更新等功能的数据语言。
   ⑤QBE(Query By Example,按例查询)是一种特殊的屏幕编辑语言。QBE是M.M.Zloof提出的,在约克镇IBM高级研究实验室为图形显示终端用户设计的一种域演算语言,1978年在IBM 370上实现。QBE使用起来很方便,属于人机交互语言,用户可以是缺乏计算机知识和数学基础的非程序员用户。现在,QBE的思想已渗入到许多DBMS中。
   ⑥还有一个语言SQL,这是介乎于关系代数和元组演算之间的一种关系查询语言,现已成为关系数据库的标准语言,我们将在第5章详细介绍。