3.2 关系演算
除了用关系代数表示关系运算外,还可以用谓词演算来表达关系的运算,这称为关系演算(relational calculus)。用关系代数表示关系的运算,须标明关系运算的序列,因而以关系代数为基础的数据库语言是过程语言。用关系演算表达关系的运算,只要说明所要得到的结果,而不必标明运算的过程,因而以关系演算为基础的数据库语言是非过程语言。目前,面向用户的关系数据库语言基本上都是以关系演算为基础的。随着所用变量不同,关系演算又可分为元组关系演算和域关系演算。
3.2.1 元组关系演算
元组关系演算(tuple relational calculus)是以元组为变量,其一般形式为:{t[〈属性表〉]P(t)},其中:t是元组变量,即用整个t作为查询对象,也可查询t中的某些属性。如查询整个t,则可省去<属性表>。P(t)是t应满足的谓词。
【例3-13】假设有关系STUDENT(学号,姓名,性别,出生年月,籍贯,地址,……)。要求用元组关系演算表达式查询北京籍女大学生的姓名。
解:{t[姓名]|t∈STUDENT AND t. 性别=‘女’AND t. 籍贯=‘江苏’}
另外,利用元组关系演算,还可以表达关系代数运算。关系代数的几种运算可以用元组表达式表示如下。
1.投影
∏:设有关系模式R(ABC),r为R的一个值,则:∏AB(r)={t[AB]|t∈r}
2.选择
仍用上述的关系,则:σF(r)={t|t∈r and F}
F是以t为变量的布尔表达式。其中,属性变量以t.A形式表示。
3.并
设r、s是R(A,B,C)的两个值,则:R∪S:可用{t|R(t)∨ S(t)}表示;
或{t|t∈R ORt∈S}
4.差
R-S:可用表示;或
5.连接
设有两个关系模式R(A,B,C)和S(C,D,E),r、s分别为两个关系中某个时刻的值,则:
r∞s={t(A,B,C,D,E)|t [A,B,C]∈ r AND t [C,D,E]∈s}
注意:谓词中两个t[C]同值,隐含等连接。
元组关系演算与关系代数具有同等表达能力,也是关系完备的。用谓词演算表示关系操作时,只有结果是有限集才有意义。一个表达式的结果如果是有限的,则称此表达式是安全的,否则是不安全的。否定常常会导致不安全的表达式,例如的结果不是有限的,是不安全的,因为现实世界中不属于STUDENT的元组是无限多的。实际上,在计算上述表达式时,所感兴趣的范围既不是整个现实世界,也不是整个数据库,而仅仅是关系STUDENT。若限制t取值的域,使t∈DOM(P),可将上式改写成:{t|t∈ DOM(P)and}=DOM(P)-STUDENT,成为安全表达式。
3.2.2 域关系演算
域关系演算(domain relational calculus)是以域为变量,其一般形式为:
{〈X1,X2,……,Xn>|P(X1,X2,……,Xn,Xn+1,……,Xn+m)}
其中:X1,X2,……,Xn,Xn+1,……,Xn+m为域变量。且X1,X2,……,Xn出现在结果中,其他m个域变量不出现在结果中,但出现在谓词P中。
域关系演算是QBE语言的理论基础。
对关系GRADE(学号,课程号,成绩),如果要查询需补考的学生的学号和补考的课程号,此时查询表达式:{<x,y>|(∃z)(GRADE(x,y,z)AND z<60)}
GRADE(x,y,z)是一个谓词,如果<x,y,z>是GRADE中的一个元组,则该谓词为真。
注意:元组变量的变化范围是一个关系;域变量的变化范围是某个值域。