在關(guān)系代數(shù)表達(dá)式中,一般都顯式指定一個(gè)計(jì)值順序岁忘,它隱含著執(zhí)行查詢的策略。在關(guān)系演算中区匠,不描述查詢執(zhí)行策略干像,即關(guān)系演算表達(dá)查詢只說(shuō)明要什么,不說(shuō)明如何得到它驰弄。
關(guān)系演算跟數(shù)學(xué)中的微積分無(wú)關(guān)麻汰,而是根據(jù)符號(hào)邏輯中的一個(gè)分支—— 謂詞演算 命名的。在數(shù)據(jù)庫(kù)中戚篙,它有兩種形式:由 Codd(1972a)首先提出的元組關(guān)系演算五鲫,由 Lacroix 和 Pirotte(1977)提出的 域 關(guān)系演算。
在一階邏輯或謂詞演算中岔擂,謂詞是一個(gè)帶參數(shù)的真值函數(shù)位喂。如果把參數(shù)值帶入,這個(gè)函數(shù)就會(huì)變成一個(gè)表達(dá)式乱灵,稱(chēng)為 命題塑崖,它非真即假。例如痛倚,“John White 是一名員工” 和 “John White 的收入高于 Ann Beech” 這兩個(gè)語(yǔ)句都是命題规婆,因此可以確定他們是真還是假。在第一個(gè)例子里蝉稳,函數(shù)為 “是一名員工”抒蚜,帶有一個(gè)參數(shù)(John White);在第二個(gè)例子中耘戚,函數(shù)為 “收入高于”削锰,它有兩個(gè)參數(shù)(John White 和 Ann Beech)。
如果某個(gè)謂詞包含一個(gè)變量毕莱,比如,“x 是一名員工”,那么就一定有一個(gè)與 x 相關(guān)聯(lián)的 論域(range)朋截。當(dāng)我們把該論域中的某些值賦給 x 時(shí)蛹稍,命題可能為真;而對(duì)于另一些值部服,命題則可能為假唆姐。例如,論域是所有人的集合廓八,若將 John White 帶入 x奉芦,則命題 “John White 是一名員工” 為真。若將某個(gè)非員工的人名帶入剧蹂,則命題為假声功。
假設(shè) P 是一個(gè)謂詞,那么所有使 P 為真得 x 的集合就可以表示成:
可以用邏輯連詞與宠叼,或先巴,非連接謂詞形成符合謂詞。
1. 元組關(guān)系演算
在元組關(guān)系演算中冒冬,我們感興趣的是找出所有使謂詞為真得元組伸蚯。這種演算是基于 元組變量 的。元組變量是 “定義于” 某個(gè)命名關(guān)系上的變量简烤,即該變量的論域僅限于這個(gè)關(guān)系中的元組(“論域” 這個(gè)詞在這里不是指數(shù)學(xué)中的值域剂邮,而是定義域)。例如横侦,指定元組變量 S 的范圍為關(guān)系 Staff挥萌,就寫(xiě)成:
F 稱(chēng)為 公式(在數(shù)理邏輯中稱(chēng)為 合式公式 或 wff)丈咐。例如瑞眼,要表示查詢 “列出收入高于 10000 英鎊的所有員工的 staffNo、fName棵逊、lName伤疙、position、sex辆影、DOB徒像、salary 及 branchNo”,可以寫(xiě)成:
存在量詞與全稱(chēng)量詞
可以在公式中使用兩個(gè)量詞來(lái)說(shuō)明謂詞將作用在多少個(gè)實(shí)例上次慢。
存在量詞 “?”(表 “存在”)在公式中說(shuō)明至少有一個(gè)實(shí)例使謂詞為真旁涤,例如:表示 “在 Branch 中存在一個(gè)元組翔曲,它在 branchNo 上的取值與 Staff 的元組 S 在 branchNo 上的取值相同而且對(duì)應(yīng)的分公司位于倫敦”。
全稱(chēng)量詞 “?”(表示 “對(duì)于所有的”)在公示中說(shuō)明每個(gè)實(shí)例都必須滿足這個(gè)謂詞劈愚,例如:表示 “Branch 中的所有分公司都不再巴黎”瞳遍。可以將德·摩根定律推廣到存在量詞和全稱(chēng)量詞菌羽。例如:
利用這些等價(jià)規(guī)則掠械,可以把前面的公式寫(xiě)成:
表示 “巴黎沒(méi)有分公司”。
受 “?” 或 “?” 約束的元組變量稱(chēng)為 約束變量注祖,反之猾蒂,其他的元組變量則成為 自由變量。在關(guān)系演算表達(dá)式中是晨,只有那些在豎線(|)左邊出現(xiàn)的變量是自由變量肚菠。
表達(dá)式和公式
正如并不是任意排列的英文字母序列都可以構(gòu)成一個(gè)結(jié)構(gòu)正確的詞語(yǔ)一樣,也不是每一個(gè)演算公式序列都可以被接受署鸡。公式序列必須是無(wú)歧義且有意義的案糙。元組關(guān)系演算中的一個(gè)表達(dá)式必須具有下面所示的一般形式:其中,S1靴庆,S2时捌,...,Sn炉抒,...奢讨,Sm 代表元組變量,每個(gè) ai 是元組變量 Si的論域關(guān)系的一個(gè)屬性焰薄,F(xiàn) 為公式拿诸。一個(gè)(合式)公式包括一個(gè)或多個(gè)原子公式,原子公式可以有下面幾種形式:
- R(Si)塞茅,其中 Si 是一個(gè)元組變量亩码,R 是一個(gè)關(guān)系。
- Si.a1 θ Sj.a2野瘦,其中 Si 和 Sj 為元組變量描沟,a1 是元組變量 Si 的論域關(guān)系的一個(gè)屬性,a2 是元組變量 Sj 的論域關(guān)系的一個(gè)屬性鞭光,θ 是比較運(yùn)算符中的一個(gè)吏廉。屬性 a1 和 a2 的值必須可進(jìn)行 θ 比較。
- Si.a1 θ c惰许,其中 Si 是一個(gè)元組變量席覆,a1 是元組變量 Si 論域關(guān)系的一個(gè)屬性,c 是屬性 a1 對(duì)應(yīng)域內(nèi)的一個(gè)常數(shù)汹买,θ 是一個(gè)比較運(yùn)算符佩伤。
可以根據(jù)下面的規(guī)則聊倔,遞歸的構(gòu)造出公式:
- 原子公式是公式。
- 如果 F1 和 F2 是公式畦戒,則它們的合取 F1 ∧ F2 方库、析取 F1 ∨ F2,以及取非 ~ F1 也是公式障斋。
- 如果 F 是帶自由變量 X 的公式,則(?X)(F) 和 (?X)(F) 也是公式徐鹤。
表達(dá)式的安全性
另外還需要說(shuō)明的是垃环,演算表達(dá)式可以生成一個(gè)無(wú)窮集。例如:
當(dāng)結(jié)果中出現(xiàn)的所有值都在表達(dá)式的域內(nèi)時(shí)沫换,這個(gè)表達(dá)式就是 安全 的。上面的表達(dá)式是不安全的最铁,原因就在于它包括了 Staff 關(guān)系之外的元組(因此超出了表達(dá)式的域)讯赏。本文中所給出的其他元組演算表達(dá)式都是安全的。一些人用獨(dú)立的 RANGE 語(yǔ)句來(lái)定義變量的論域冷尉,以避免這個(gè)問(wèn)題的出現(xiàn)漱挎。
2. 域關(guān)系演算
在元組關(guān)系演算中,使用了定義在關(guān)系上的元組變量雀哨。在域關(guān)系演算中磕谅,同樣也要用到變量,但它的論域不再是關(guān)系中的元組震束,而是屬性的域怜庸。域關(guān)系演算中的表達(dá)式具有下面的一般形式:
其中,d1垢村,d2割疾,...,dn嘉栓,...宏榕,dm代表域變量拓诸,F(xiàn)(d1,d2麻昼,...奠支,dm) 代表由某些原子公式組成的公式,原子公式可以有以下幾種形式:
- R(d1抚芦,d2倍谜,...,dn)叉抡,其中 R 是維數(shù)為 n 的關(guān)系尔崔,di 為域變量。
- di θ dj褥民,其中 di 和 dj 代表域變量季春,θ 是比較運(yùn)算符中的一個(gè)。di 和 dj 對(duì)應(yīng)域的值必須可進(jìn)行 θ 比較消返。
- di θ c载弄,其中 di 是域變量,c 是 di 對(duì)應(yīng)域中的一個(gè)常數(shù)撵颊,θ 是某個(gè)比較運(yùn)算符宇攻。
可以根據(jù)下面的規(guī)則,用原子公式遞歸的構(gòu)造出公式:
- 原子公式是公式秦驯。
- 如果 F1 和 F2 是公式尺碰,則它們的合取 F1 ∧ F2 、析取 F1 ∨ F2译隘,以及取非 ~ F1 也是公式亲桥。
- 如果 F 是帶自由變量 X 的公式,則(?X)(F) 和 (?X)(F) 也是公式固耘。
當(dāng)把域關(guān)系演算限制為安全表達(dá)式時(shí)题篷,它就等價(jià)于安全的元組關(guān)系演算,而這種元組關(guān)系演算又等價(jià)于關(guān)系代數(shù)厅目。這就意味著番枚,每個(gè)關(guān)系代數(shù)表達(dá)式都存在一個(gè)與之等價(jià)的關(guān)系演算表達(dá)式,反過(guò)來(lái)损敷,每個(gè)元組或者域關(guān)系演算表達(dá)式都存在一個(gè)與之等價(jià)的關(guān)系代數(shù)表達(dá)式葫笼。
3. 其他語(yǔ)言
雖然關(guān)系演算難于理解與使用,但其非過(guò)程性令人滿意拗馒,因此人們開(kāi)始尋求更易于使用的非過(guò)程化技術(shù)路星。這導(dǎo)致了另外兩類(lèi)關(guān)系語(yǔ)言的出現(xiàn):面向轉(zhuǎn)換的語(yǔ)言和圖形化語(yǔ)言。
面向轉(zhuǎn)換的語(yǔ)言(transform-oriented language):是一種非過(guò)程語(yǔ)言 诱桂,它利用關(guān)系將輸入數(shù)據(jù)轉(zhuǎn)換成期望的輸出洋丐。這種語(yǔ)言提供了一種易于使用的結(jié)構(gòu)呈昔,可以很容易的根據(jù)已知的內(nèi)容表述出所期望的結(jié)果。SQUARE(Boyce et al.友绝,1975)堤尾、SEQUEL(Chamberin et al.,1976)以及 SEQUEL 的后繼產(chǎn)品 SQL 語(yǔ)言都是面向轉(zhuǎn)換的語(yǔ)言迁客。
圖形化語(yǔ)言(graphical language):給用戶提供了關(guān)系結(jié)構(gòu)的一種圖解說(shuō)明郭宝。用戶在一個(gè)實(shí)例中填入想要的輸出,系統(tǒng)則以這種格式返回所需的數(shù)據(jù)哲泊。QBE(舉例查詢)就是圖形化語(yǔ)言(Zloof剩蟀,1977)的一個(gè)范例。
還有一類(lèi)稱(chēng)為 第四代語(yǔ)言(4GL)切威,它允許用戶使用一個(gè)受限的命令集來(lái)創(chuàng)建完整的用戶應(yīng)用,這個(gè)命令集對(duì)用戶十分友好丙号,通常為菜單驅(qū)動(dòng)的環(huán)境先朦。某些系統(tǒng)還能接受自然語(yǔ)言,比如受限的英語(yǔ)犬缨。這類(lèi)語(yǔ)言常稱(chēng)為 第五代語(yǔ)言(5GL)喳魏,它們的發(fā)展仍處于起步階段。