Table of Contents
第六章 形式化關係查詢語言
6.1 關係代數
關係代數是一種過程化查詢語言,它包括一個運算的集合,這些關係以一個或兩個關係爲輸人,產生一個新的關係作爲結果。
- 基本運算:選擇、投影、更名、並、集合差、笛卡爾積
- 其他運算:集合交、自然連接、賦值、外連接、廣義投影、聚集運算
6.1.1 基本運算
- 一元運算:選擇、投影、更名
- 二元運算:並、集合差、笛卡爾積
基本運算能夠增強關係代數的表達能力。
6.1.1.1 選擇運算 (select)
選擇(select)運算選出滿足給定謂詞的元組。
例如:下面的公式代表從instructor關係中選出dept_name=”Physics“的元組
允許在選擇謂詞中間進行比較:=,≠,>,≥, <, ≤
選擇謂詞之間也可以使用連詞:and(⋀), or(⋁), not(¬)將多個謂詞合併爲一個較大的謂詞
6.1.1.2 投影運算
投影(project)運算使得我們可以選出想要的屬性,把另一些屬性排除在外。
例如:選擇出instructor的ID,name和salary列
6.1.1.3 關係運算的組合
注意:關係運算的結果本身也是 一個關係。
把多個關係代數運算可以組成一個關係代數表達式(relational-algebra expression)。
6.1.1.4 並運算
並(union)運算將兩個集合取並集。
要使得並運算(r ∪ s)有意義,需要同時滿足下面兩個條件:
- r和s是同元的,即它們的屬性數目必須相同
- 對所有的i, r的第i個屬性的域必須與s的第i個屬性的域相同
例如:下面的公式要找出在2009年秋季或2010年春季開設的課程的集合
6.1.1.5 集合差運算
集合差(set-difference)運算能夠找出在一個關係中而不在另一個關係中的那些元組。用r-s表示在r中而不在s中的元組。
與並運算一樣,有意義的集合差運算也需要同時滿足兩個條件,確保其相容。
例如:找出所有開設在2009年秋季,但是在2010年春季不開設的課程
6.1.1.6 笛卡爾積運算
笛卡爾積(cartesian-product)運算,用乘號(×)表示。
關係r1有n1個元組,關係r2有n2個元組,則r1×r2共有n1×n2個元組。
例子:找出物理系的老師,以及他們所教授的課程
instructor(ID, name, dept_name, salary)
teaches(ID,course_id, sec_id,semesters)
注意:關係代數表達式不是唯一的,上述兩個式子是等價的(equivalent)
6.1.1.7 更名運算
更名(rename)運算可以重命名關係。用ρ表示。
下面的式子表示把名字x賦予E。
假設E是n元的,下面的式子表示把名字x賦予E,並將它的屬性更名爲A1, A2, ..., An。
例如:找出大學裏面的最高工資
- 步驟1:計算出由非最高工資組成的臨時關係
- 步驟2:instructor中的salary與剛剛計算出的臨時關係的集合差
更名運算不是必須的,也可以使用位置標記。可以使用位置標記隱含的作爲關係的屬性名。
用$1,$2,...指代第一個屬性,第二個屬性.....
例如:下面的關係表達式等價於上面的步驟2的表達式,$4代表第一個關係的salary屬性,$8代表第二個關係的salary
6.1.2 關係代數的形式化定義
關係代數的基本表達式必須是如下二者之一:
- 數據庫中的一個關係
- 常數關係。例如:{(2222,Einstein, Physics, 95000),(2223,Emma, English, 96000) }
下列這些都是關係代數表達式:
- 並、交集、差集、投影、選擇、更名
6.1.3 附加的關係代數運算
6.1.3.1 集合交運算
集合的交(Intersection)運算。
例如:找出2009年秋季和2010年春季都開課的課程。
r∩s=r-(r-s)===>因此,集合交不是基本運算,不能增強關係代數的表達能力。
6.1.3.2 自然連接運算
自然連接(join)用符號⋈表示,例如:
自然連接運算首先形成兩個關係的笛卡爾積,再在兩個關係中都出現的屬性上的相等值進行選擇,最後去除重複性。
自然連接的形式化定義。設r(R)和s(S)是兩個關係,R和S分別是關係r和關係s所包含的屬性列表。r和s的自然連接可表示爲r⋈s,
其中
注意:自然連接滿足可結合的(associative) :(a⋈b)⋈c=a⋈(b⋈c)
theta連接(theta join)是自然連接的擴展,它可以把一個選擇運算和一個笛卡爾積運算合併爲單獨的一個運算。若r(R)和s(S)兩個關係,θ是R∪S的屬性上的謂詞,則theta連接運行可定義爲:
6.1.3.3 賦值運算
賦值(assignment)運算用←表示。
例如:temp1 ← R×S 將右側的結果賦值給左側的關係變量
6.1.3.4 外連接運算
外連接運算(outer join)是連接運算的擴展,可以處理缺失的信息。
外連接有三種:左外連接、右外連接、全外鏈接
6.1.4 擴展的關係代數運算
6.1.4.1 廣義投影運算
廣義投影(generalized-projection):通過運行在投影列表中使用算術運算和字符串函數等來對投影進行擴展,定義如下:
6.1.4.2 聚集運算
聚集函數(aggregate function)輸入值的一個彙總,將單一值作爲結果返回。包括:
- sum、average、count、min、max、count_distinct
舉例:
多重集(multiset):允許一個值出現多次的集合稱爲多重集。
多重集(multiset relational algrebra)運算:對多重集進行操作。
6.2 元組關係推演
用{t|P(t)}表示,所有事謂詞P爲真的元組t的集合。
6.2.1 查詢示例
找出所有工資爲80000美元以上的教師的ID,name, dept_name和salary:
{t|t∈instructor ∧ t[salary]>80000}
存在結構:表示關係r中存在元組t使得謂詞Q(t)爲真
或(∨), 與(∧),非(¬)
蘊含(⟹) :P⟹Q表示如果P爲真,則Q爲真。邏輯上等價於¬PVQ
存在,全部
6.2.2 形式化定義
元組關係演算表達式具有如下形式:{t|P(t)}
其中P是一個公式。公式中可以出現多個元組變量。
變量分爲 自由變量和 受限變量。不被∃或∀修飾的變量稱爲自由變量。
元組關係演算的公式由原子構成。原子可以是如下形式之一:
6.2.3 表達式的安全性
元組關係演算表達式可能產生一個無線的關係。例如:
不在instructor中的元組有無限多個,大多數這樣的元組所包含的數值甚至都不在數據庫中!這是我們不希望看到的。
域(domain), dom(P)表示元祖關係公式P所引用的所有值的集合。它既包括P中顯示出現的值,及名稱出現在P中的那些關係所涉及到的關係的元組中出現的所有值。
dom(t∈instructor ∧ t[salary]>5000)是包括所有工資大於5000的instructor元組的集合。
上圖中的關係表示是不安全的,因爲dom(圖中表達式)是所有出現在instructor中的值的集合,但是事實上t可能不在instructor中,包含不在instructor中出現的內容。
如果出現在表達式{t|P(t)}結果中的所有值均來自domain(P), 則{t|P(t)}是安全的。
6.2.4 語言的表達能力
斷言:對於每個只運用基本操作(笛卡爾積,選擇,投影,並,集合差)的關係代數表達式<==>都有與之等價的元組關係表達水;反之亦然。
6.3 域關係運算
域關係演算(domain relational calculus): 使用從屬性域中取值的域變量,而不是整個元組的進行關係演算。
6.3.1 形式化定義
6.3.2 查詢的例子
6.3.3 表達式的安全性
6.3.4 語言的表達能力
當我們把域關係運算限制在安全表達式範圍內,它與被限制在安全表達式範圍內的元組關係表達式具有相同的表達能力。
下述三者是等價的:
- 基本關係代數(不包括擴展關係代數運算)
- 限制在安全表達式範圍內的元組關係演算
- 限制在安全表達式範圍內的域關係運算
總結
- 關係代數(relational algebra)定義了一套在表上運算且輸出結果也是表的代數運算。這些運算可以混合使用來得到表達式所希望查詢的表達式。關係代數定義了關係查詢語言中使用的基本運算。
- 關係代數運算可分爲:
- 基本運算,包括:選擇、投影、並、差、笛卡爾積、更名
- 附加的運算,可以用基本運算表達,包括:交、自然連接、賦值、外連接
- 擴展的運算,其中的一些擴展了關係代數的表達能力,包括:廣義投影、聚集
- 關係代數是一種簡潔的、形式化的語言,不適用於那些偶爾使用數據庫系統的用戶。因此,商用數據庫系統採用更多”語法修飾“的語言。SQL是基於關係代數的
- 元組關係演算(tuple relational calculus)和域關係演算(domain relational calculus)是非過程化語言,代表了關係查詢語言所需的基本能力。基本關係代數是一種非過程化語言,在能力上等價於被限制在安全表達式範圍內的關係演算的兩種形式
- 關係演算是簡潔的、形式化的語言,並不適合於那些偶爾使用數據庫系統的用戶。這兩種形式化語言構成了兩種更易使用的語言QBE和Datalog的基礎。