關系代數的運算是一種數學運算,你主要功能是通過這種數學運行來指導數據庫在關系操作上的程序實現。
如圖所示,下面是關系代數的操作,上面是對應的SQL語句。如果我們熟悉關系代數的操作那么就很容易寫出復雜的SQL語句了。
關系代數的操作
對關系進行運算時,我們可以采用對待集合的方式來操作,這些操作被稱為集合操作。其他的一些操作不能在集合上使用,那么被成為純關系操作。
對於集合操作中U,∩,-操作需要滿足並相容性
並操作
舉例
差運算
舉例
笛卡兒積
笛卡兒積是將關系R中的每個元組與關系S中的每個元組進行拼接組成一個新的關系
下面是RxS的結果,R和S使用上圖中的R,S
選擇操作
選擇操作就是從關系中選出符合條件的元組,選出某一些行來進行操作
舉例
選擇A2值為a或b的元祖
投影操作
投影操作是從關系R中選出某些列。
舉例
將A1和A3進行投影,如果投影中有重復的元組則需要去掉
連接操作
連接操作是先對兩個關系做笛卡兒積生成一個新的關系,然后在新的關系上做選擇操作
Ɵ是比較運算符,如>,<,=等
舉例
下圖中先將R和S進行笛卡爾積運算,然后在選出B<=H的元組來。
下圖中使用了自連接操作
自然連接
自然連接是一種特殊的等值鏈接,他要求關系R和關系S具有相同的屬性組B(b1,b2,b3……),這些屬性組的取值是相等的,在最后生成的關系中去掉屬性重復的列。
舉例
下圖中屬性相同的只有一項B
除操作
除操作比較復雜,它是一種全包含操作,通過下面的例子來解釋除操作
在(1)中計算R除以S操作,首先生成的關系中沒有R和S的公共屬性A3。其次生成的關系中每個元組與S中的元組進行組合都能出現在R中。
在(3)中只有(a,e)的原因是只有(a,e)與S中的每個元組組合才能出現在R中,而像(d,b)這種元組如果如S中每個元組組合的話不能全部出現在R中。
在(2)中我們可以這樣來理解除法運算,找出即出現c又出現f的元組,並且這些元組的其余屬性值是相等的。如包含c和f的元組有【(a,b,c)】,【(d,b,c),(d,b,f)】【(a,e,c),(a,e,f)】,其余屬性值相等的有(a,e),(d,b)。
外連接操作
提出問題
有三張表分別是Teacher(T#, Tname, Salary), Course(C#, Cname), Teach(T#, C#)
請列出所有老師的信息,包括姓名,工資,所教課程
下面是關系代數公式:
通過自然連接然后進行投影,我們可以選出需要的信息。但是我們發現遺漏了一個老師,這是因為在自然連接的時候只有相等的才能被選擇出來,而在Teach表中沒有編號為003的老師,也就是說編號為003的老師沒有教授課程,所以在最終結果中我們遺漏了一個老師。
兩個關系R和S進行連接時,如果關系R中的元組在S中沒有找到相匹配的元組,或者關系S中元組在R中沒有找到相匹配的。為了避免元組信息的丟失,假定R或S中存在一個值全為空的元組,然后將未匹配的元組與全為空的元組連接起來。
如同所示R中的第二行和第三行記錄在S中未找到匹配的,那么就與空元組進行連接,S中的元組亦然。所以最后的外連接結果如上圖所示。
- 左外連接,保證左邊表中的元組不丟失
- 右外連接,保證右邊表中的元組不丟失
- 全外連接,保證兩個表中的元組都不丟失
下面是左外連接和右外連接,全外鏈接如上圖所示