- 數據庫系統原理及MySQL應用教程(第2版)
- 李輝等編著
- 1215字
- 2020-10-15 17:32:31
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中的一個元組,則該謂詞為真。
注意:元組變量的變化范圍是一個關系;域變量的變化范圍是某個值域。
- Designing Machine Learning Systems with Python
- DevOps with Kubernetes
- Python數據分析入門與實戰
- TypeScript Blueprints
- PHP程序設計(慕課版)
- 信息安全技術
- Python高效開發實戰:Django、Tornado、Flask、Twisted(第3版)
- 數據結構案例教程(C/C++版)
- Julia for Data Science
- 智能手機APP UI設計與應用任務教程
- C++程序設計教程(第2版)
- Python趣味創意編程
- Java Web入門很輕松(微課超值版)
- Learning PrimeFaces Extensions Development
- HTML5+CSS3+JavaScript案例實戰