一、關係代數
關係代數是一種過程化查詢語言,它包括一個運算的集合,這些運算以一個或兩個關係爲輸入,產生一個新的關係作爲結果。
關係代數的基本運算有:選擇、投影、集合並、集合差和笛卡爾積,在基本運算之外還有一個其他運算,即集合交、自然連接和賦值。
選擇、投影都是一元運算,因爲他們都是對一個關係進行運算;另外三個運算對兩個關係進行運算,所以稱爲二元運算。
1.1、選擇(select)
選擇運算選出滿足給定謂詞的元組,用小寫希臘字母(σ)來表示,而將謂詞寫作σ的下標。參數關係在σ後的括號中。 選擇相當於數據庫關鍵字where的作用。
通常還允許在選擇謂詞中進行比較,使用=,≠,<,≤,>和≥,另外還可以用連詞and(Λ)、or(ν)和not(¬)將多個謂詞合併稱一個較大的謂詞。
選擇謂詞中還可以包含兩個屬性的比較
定義關係employee如下:
id | name | dept_name | subject | salary |
1001 | Jack | Music | Music | 7500 |
1002 | Bob | History | War History | 8000 |
1003 | Alice | Physics | Physics | 8500 |
1004 | Mary | History | War History | 9000 |
1005 | James | Music | Music | 9000 |
定義關係teacher如下:
id | name | age | sex |
1001 | Jack | 35 | man |
1002 | Green | 21 | man |
1003 | Alice | 28 | woman |
例1:選擇部門爲History的所有元組
σdept_name = 'History' (employee)
例2:選擇薪資大於8000的所有元組
σsalary > 8000 (employee)
例3:選擇歷史系薪資大於8000的元組
σdept_name = 'History' Λ salary > 8000 (employee)
例4:選擇部門和科室名稱一樣的所有元組
σdept_name = subject (employee)
1.2、投影(Projection)
投影運算也是一元運算,它返回作爲參數的關係,但把某些屬性排除在外。由於關係是一個集合,所以所有的重複行均被去除。投影相當於數據庫關鍵字select的作用,用大寫希臘字母(π)表示,列舉所有需要的在結果中出現的屬性作爲π的下標,作爲參數的關係在π的後面的括號中。
例1:查詢employee關係中所有的id、name和dept_name
πid,name,dept_name(employee)
1.3、關係運算組合
關係運算的結果自身也是一個關係,實際場景中的查詢更多的是複雜的查詢。需要查詢所有歷史系的員工的姓名,則表達式如下:
πname(σdept_name = 'History' (employee))
將多個關係代數運算組合成一個關係代數表達式。
1.4、集合並運算
並運算相當於將兩個集合進行合併,並運算用符號(∪)表示,如將關係R和關係S進行並運算記作 R ∪ S,要使得並運算需要滿足兩個條件
1、關係R和關係S必須是同元的,即屬性必須相同(兩個集合字段相同)
2、對所有的i,R的第i個屬性的域必須和S的第i個屬性的域相同(相同字段的取值範圍也相同)
例1:查詢音樂系和歷史系薪資大於8500的員工姓名
查詢音樂系薪資大於8500的員工: πname(σdept_name = 'Music' Λ salary > 8500 (employee))
查詢歷史系薪資大於8500的員工: πname(σdept_name = 'History' Λ salary > 8500 (employee))
則將兩個結果進行合併的表達式爲: πname(σdept_name = 'Music' Λ salary > 8500 (employee)) ∪ πname(σdept_name = 'History' Λ salary > 8500 (employee))
1.5、集合差運算
差運算用字符(—)表示,用於找到在一個關係中而不在另一個關係中的元組。表達式 R — S 表示結果在R中而不在S中的元組。
例1:查詢音樂系中的不是男老師的員工姓名
查詢音樂系員工:πname(σdept_name = 'Music' (employee))
查詢男老師姓名:πname(σsex = 'man' (teacher))
則將兩個結果用差運算表達式爲:πname(σdept_name = 'Music' (employee))— πname(σsex = 'man' (teacher))
1.6、笛卡爾積
笛卡爾積用字符(X)表示,使得可以將任意兩個關係的信息集合在一起。將關係r1和r2的笛卡爾積寫作r1 X r2
由於相同的屬性可能同時出現在r1和r2中,所以需要提出一個命名機制來區別這些屬性,通常將關係名稱附加到該屬性上, 屬性只在一個關係中存在的可以省略掉關係名稱前綴。例如 r = employee X teacher 的關係模式所有屬性如下:
(employe.id, employe.name, dept_name, subject, salary, teacher.id, teacher.name, age, sex)
r = emplpyee X teacher的所有元組結果如下:
employe.id | employe.name | dept_name | subject | salary | teacher.id | teacher.name | age | sex |
1001 | Jack | Music | Music | 7500 | 1001 | Jack | 35 | Man |
1001 | Jack | Music | Music | 7500 | 1002 | Green | 21 | Man |
1001 | Jack | Music | Music | 7500 | 1003 | Alice | 28 | Woman |
1002 | Bob | History | War History | 8000 | 1001 | Jack | 35 | Man |
1002 | Bob | History | War History | 8000 | 1002 | Green | 21 | Man |
1002 | Bob | History | War History | 8000 | 1003 | Alice | 28 | Woman |
1003 | Alice | Physics | Physics | 8500 | 1001 | Jack | 35 | Man |
1003 | Alice | Physics | Physics | 8500 | 1002 | Green | 21 | Man |
1003 | Alice | Physics | Physics | 8500 | 1003 | Alice | 28 | Woman |
1004 | Mary | History | War History | 9000 | 1001 | Jack | 35 | Man |
1004 | Mary | History | War History | 9000 | 1002 | Green | 21 | Man |
1004 | Mary | History | War History | 9000 | 1003 | Alice | 28 | Woman |
1005 | James | Music | Music | 9000 | 1001 | Jack | 35 | Man |
1005 | James | Music | Music | 9000 | 1002 | Green | 21 | Man |
1005 | James | Music | Music | 9000 | 1003 | Alice | 28 | Woman |
例1:查詢歷史系中的所有老師薪資
πsalary(σemploey.name = teacher.name (σdept_name = 'History'(employee X teacher)))
1.7、集合交運算
集合交運算用符號(∩)表示,集合交運算表示兩個集合交集,可以用集合差來表示,如 R ∩ S = R - ( R - S)
例1:查詢歷史系中的男老師姓名
πname(σdept_name= 'History' (employee)) ∩ πname(σsex= 'Man' (teacher))
1.8、自然連接運算
自然連接是對笛卡爾積點查詢進行簡化的表達方式。自然連接用符號(⋈)表示,自然連接運算首先形成兩個參數的笛卡爾積,然後基於兩個關係模式中都出現的屬性上的相等性進行選擇,最後還會去除掉重複屬性。比如employe和teacher進行自然連接運算。
根據id和name來進行自然連接,表達式爲:πid, name(employe ⋈ teacher),形成的集合爲:
id | name | dept_name | subject | salary | age | sex |
1001 | Jack | Music | Music | 7500 | 35 | Man |
1003 | Alice | Physics | Physics | 8500 | 28 | Woman |
1.9、賦值運算
賦值運算相當於定義變量,將某些表達式用一個臨時變量賦值的方式代替。賦值運算通過符號(←)表示
如定義:temp ← employe ⋈ teacher, 則 πid, name(temp) 就相當於是 πid, name(employe ⋈ teacher)
1.10、外連接運算
外連接運算是連接運算的擴展,可以處理缺失的信息,外連接在連接結果中添加額外的元組。外連接分爲左外連接(⋊)、右外連接(⋉)和全外連接(⋊⋉)
左外連接:取出左側關係中所有與右側關係的人一元組都不匹配的元組,用空值填充所有來自右側關係的屬性,再把產生的元組加到自然連接的結果中。
右外連接:與左外連接對稱,用空值填充來自右側關係的所有與左側關係的任一元組都不匹配的元組,將結果加到自然連接的結果中。
全外連接:既做左外連接又做右外連接,既填充左側關係中與右側關係的任一元組都不匹配的元組,又填充右側關係中與左側關係的任一元組都不匹配的元組,並把結果添加到自然連接到結果中。
1.11、廣義投影
廣義投影允許在投影列表中使用算術運算和字符串函數來對投影進行擴展。如employee中查詢員工每個月的薪資,表達式爲:πname,salary/12(employee)
1.12、聚集運算
聚集運算用符號(g)表示,聚集運算時可以用來對值的集合使用聚集函數,例如計算最小值或平均值等。
聚集函數輸入值的一個彙集,將單一值作爲結果返回,例如聚集函數sum輸入值的一個彙集,返回這些值的和,將函數sum用於彙集{1, 2, 3, ,4 ,5} 上返回的值爲15
例1:統計所有員工的薪資總和,表達式爲:gsum(salary)(employee)
通常SQL語句都可以用關係代數來重寫,比如:
select A1, A2, sum(A3) from r1, r2, r3 where P group by A1, A2
等價於關係代數表達式: A1, A2, gsum(A3)(πA1,A2,A3(σP (r1 X r2 X r3)))
二、元組關係演算
元組關係演算上非過程化的查詢語言,它只描述所需信息,而不給出獲得該信息的具體過程。
元組關係運算的查詢表達式爲:{ t | P (t) }
也就是說,它是所有使謂詞P爲真大元組t的集合,我們用 t[A] 表示元組t在屬性A上的值, 並用 t ∈ r 表示元組t在關係r中。
例1:查詢所有薪資在8000以上的員工id、name、dept_name、subject和salary
{ t | t ∈ employee Λ t [salary] > 8000}
假如我們只需要獲取員工的id,而不需要employee的其他字段。爲了用元組關係演算來書寫這個查詢,需要爲模式(id)上的關係寫一個表達式。此時需要引入數理邏輯中的“存在”結構,表達式爲:
∃t ∈ r(Q(t)),表示“關係r中存在元組t使謂詞Q(t)爲真”
例2:查詢所有薪資大於8000的員工id
{ t | ∃s ∈ employee( t [id] = s [id] Λ s [salary] > 8000 ) }
含義爲:在關係employee中存在元組s 使 t 和 s 在屬性ID上的值相等,且 s 在屬性salary上的值大於8000