關(guān)系代數(shù)基于集合(關(guān)系)榴鼎,定義了一系列對集合(關(guān)系)對操作。如并晚唇,差巫财,笛卡爾積,選擇哩陕,更名平项,投影等基本操作,以及基于基本操作推導(dǎo)出來的擴展操作悍及。
關(guān)系代數(shù)作用于一個或多個關(guān)系闽瓢,然后產(chǎn)生一個新的關(guān)系⌒母希可以將關(guān)系代數(shù)理解為函數(shù)扣讼,接受一個關(guān)系輸入,返回一個新對關(guān)系缨叫。舉個例子椭符,我們將并操作命名為 Union
,那么并操作可以表示為:
output:R = Union(input:R);
對于其他對操作如差操作耻姥,選擇操作等销钝,都有相應(yīng)對數(shù)學(xué)符號進行表示,但在簡書中輸入這些符號比較困難琐簇,再加上我學(xué)習(xí)關(guān)系代數(shù)是了解基本的概念知識蒸健,這里就不使用數(shù)學(xué)符號表示了,而是以文字代替婉商。
關(guān)系代數(shù)定義了基于集合(關(guān)系)的操作似忧,其是 SQL 的重要基礎(chǔ)(另一個重要基礎(chǔ)是關(guān)系演算),了解了關(guān)系代數(shù)的概念以及各個操作要達到的目的之后据某,對 SQL 中對一些概念也會更加清晰橡娄,如連接操作。
本文首先介紹關(guān)系代數(shù)中的基礎(chǔ)操作癣籽,再介紹擴展操作挽唉。
基礎(chǔ)操作
關(guān)系代數(shù)的基礎(chǔ)操作有:并,差筷狼,笛卡爾積瓶籽,選擇,更名埂材,投影等塑顺。有些操作如并,差等要求參與運算的關(guān)系需要具備并相容性。所謂并相容性严拒,就是兩個關(guān)系的屬性數(shù)目(度)相同扬绪,并且每個度所在的域相同。
如 R(學(xué)生,學(xué)號,地址)
和 S(課程,課程號)
兩個關(guān)系由于度和屬性所在的域不相同裤唠,因此不具備并相容性挤牛,也就無法進行并,差等操作种蘸。
相應(yīng)的墓赴,R2(學(xué)生,學(xué)號,地址)
和 S(教師,教師號,地址)
由于度和屬性所在的域相同,因此具備并相容性航瞭。
并操作
并操作就是將兩個關(guān)系合并為一個關(guān)系诫硕,在合并時去掉重復(fù)的元組。為什么要去掉重復(fù)項呢刊侯?這是集合的特質(zhì)章办,集合要求不能有重復(fù)項。
R 并 S 和 S 并 R 得到的結(jié)果是一樣的滔吠,即并操作滿足交換律纲菌。
舉個例子挠日,有兩個關(guān)系 R(學(xué)生) 和 S(教師):
姓名 | 學(xué)號 | 地址 |
---|---|---|
Mary | 1 | 美國 |
Jerry | 2 | 澳大利亞 |
馬云 | 3 | 中國 |
姓名 | 教師號 | 地址 |
---|---|---|
王力 | 1 | 中國 |
Jerry | 2 | 澳大利亞 |
劉東 | 3 | 中國 |
這兩個關(guān)系進行并操作的結(jié)果為:
姓名 | 學(xué)號/教師號 | 地址 |
---|---|---|
Mary | 1 | 美國 |
Jerry | 2 | 澳大利亞 |
馬云 | 3 | 中國 |
王力 | 1 | 中國 |
劉東 | 3 | 中國 |
差操作
差操作用來選擇出現(xiàn)在一個關(guān)系但并未出在另一個關(guān)系中的元組疮绷。
還是以上面兩個關(guān)系 R(學(xué)生)
和 S(教師)
為例,R 差 S 的結(jié)果為:
姓名 | 學(xué)號/教師號 | 地址 |
---|---|---|
Mary | 1 | 美國 |
馬云 | 3 | 中國 |
S 差 R 的結(jié)果為:
姓名 | 學(xué)號/教師號 | 地址 |
---|---|---|
王力 | 1 | 中國 |
劉東 | 3 | 中國 |
其中元組 T(Jerry,2,澳大利亞)
在兩個關(guān)系中都出現(xiàn)嚣潜,是兩個關(guān)系的交集冬骚。因此差操作就是從一個關(guān)系中去除和另一個關(guān)系的交集所得到的集合。
差操作不滿足交換律懂算。
笛卡爾積
笛卡爾積用來將兩個關(guān)系連接起來只冻,笛卡爾積的結(jié)果將兩個關(guān)系中所有可能的元組組合起來。假設(shè)關(guān)系 R 的元組數(shù)目為 M计技,度數(shù)為 I喜德,關(guān)系 S 的元組數(shù)目為 N,度數(shù)為 J垮媒,那么 R 和 S 進行笛卡爾積運算得到的新關(guān)系的元組數(shù)目為 M * N舍悯,度數(shù)為 I + J。
舉個例子睡雇,有兩個關(guān)系 R(學(xué)生)
和 S(課程)
:
姓名 | 學(xué)號 | 課程號 |
---|---|---|
Mary | s1 | c1 |
Jerry | s2 | c2 |
Mike | s3 | c2 |
課程名 | 課程號 |
---|---|
軟件工程 | c1 |
軟件測試 | c2 |
數(shù)據(jù)庫系統(tǒng)原理 | c3 |
那么對 R 和 S 進行笛卡爾積的結(jié)果為:
姓名 | 學(xué)號 | 課程 | 課程號 |
---|---|---|---|
Mary | s1 | 軟件工程 | c1 |
Jerry | s2 | 軟件工程 | c1 |
Mike | s3 | 軟件工程 | c1 |
Mary | s1 | 軟件測試 | c2 |
Jerry | s2 | 軟件測試 | c2 |
Mike | s3 | 軟件測試 | c2 |
Mary | s1 | 數(shù)據(jù)庫系統(tǒng)原理 | c3 |
Jerry | s2 | 數(shù)據(jù)庫系統(tǒng)原理 | c3 |
Mike | s3 | 數(shù)據(jù)庫系統(tǒng)原理 | c3 |
笛卡爾積用來將兩個關(guān)系連接在一起萌衬,獲取所有可能的結(jié)果,其是連接操作的基礎(chǔ)它抱。
選擇操作
選擇操作就是從一個關(guān)系中秕豫,選擇出滿足條件的元組。
如從上面的學(xué)生表中观蓄,選擇出學(xué)號大于等于 2 的學(xué)生混移,結(jié)果為:
姓名 | 學(xué)號 | 地址 |
---|---|---|
Jerry | 2 | 澳大利亞 |
馬云 | 3 | 中國 |
選擇條件由與或非邏輯表達式構(gòu)成祠墅。
投影操作
投影操作是從給定的關(guān)系中,選擇出某些屬性屬性構(gòu)成新的關(guān)系歌径。如從學(xué)生表中投影出一個新的關(guān)系 R(姓名,地址)
:
姓名 | 地址 |
---|---|
Jerry | 澳大利亞 |
馬云 | 中國 |
擴展操作
關(guān)系代數(shù)常用的擴展操作有交操作饵隙,Theta 連接操作,自然連接操作沮脖,外連接操作金矛,除操作等。擴展操作可以由基礎(chǔ)操作推導(dǎo)而來勺届。
交操作
交操作用來從兩個關(guān)系中驶俊,選擇出同時存在于兩個關(guān)系中的元組。如上面 R(學(xué)生)
和 S(教師)
進行交操作的結(jié)果為:
姓名 | 學(xué)號/教師號 | 地址 |
---|---|---|
Jerry | 2 | 澳大利亞 |
Theta 連接操作
Theta 連接操作會從兩個關(guān)系的笛卡爾積中免姿,選擇出某個條件的元組饼酿,并去掉重復(fù)項。例如在上面笛卡爾積例子胚膊,選擇出課程號不為 c1 并且學(xué)號不為 s1 的元組:
姓名 | 學(xué)號 | 課程 | 課程號 |
---|---|---|---|
Jerry | s2 | 軟件測試 | c2 |
Mike | s3 | 軟件測試 | c2 |
Jerry | s2 | 數(shù)據(jù)庫系統(tǒng)原理 | c3 |
Mike | s3 | 數(shù)據(jù)庫系統(tǒng)原理 | c3 |
連接操作一般和投影操作配合使用故俐,比如從上面的結(jié)果集中投影出 R(姓名,課程)
:
姓名 | 課程 |
---|---|
Jerry | 軟件測試 |
Mike | 軟件測試 |
Jerry | 數(shù)據(jù)庫系統(tǒng)原理 |
Mike | 數(shù)據(jù)庫系統(tǒng)原理 |
Theta 連接操作中有個特殊的操作,叫做等值連接紊婉,即選擇條件為判斷是否相等药版。
自然連接操作
自然連接可以認(rèn)為是一種特殊的等值連接,其要求兩個關(guān)系具有相同的屬性喻犁,并且判斷條件為兩個關(guān)系中的某兩個相同屬性的值相等槽片。
自然連接是最常用的連接操作。
假如有兩個關(guān)系 R(學(xué)生 )
和 S(班級)
:
姓名 | 學(xué)號 | 班級 |
---|---|---|
Jerry | s2 | 高二八班 |
Mike | s3 | 高三一班 |
Jerry | s2 | 初一二班 |
Mike | s3 | 初三一班 |
班級 | 班主任 |
---|---|
高二八班 | 馬云 |
高三一班 | 劉東 |
初一二班 | 史柱 |
初三一班 | 李彥 |
對這兩個關(guān)系進行自然連接的結(jié)果為:
姓名 | 學(xué)號 | 班級 | 班主任 |
---|---|---|---|
Jerry | s2 | 高二八班 | 馬云 |
Mike | s3 | 高三一班 | 劉東 |
Jerry | s2 | 初一二班 | 史柱 |
Mike | s3 | 初三一班 | 李彥 |
外連接
外連接就是在自然連接的結(jié)果集中肢础,將空值元組和沒有匹配到的元素放入到結(jié)果集中还栓。
假如有兩個關(guān)系 R(學(xué)生 )
和 S(班級)
:
姓名 | 學(xué)號 | 班級 |
---|---|---|
Jerry | s2 | 高二八班 |
Mike | s3 | 高三一班 |
Jerry | s2 | |
Mike | s3 | 初三一班 |
班級 | 班主任 |
---|---|
高二八班 | 馬云 |
高三一班 | 劉東 |
高三五班 | 陳天 |
史柱 |
首先對這兩個關(guān)系進行自然連接:
姓名 | 學(xué)號 | 班級 | 班主任 |
---|---|---|---|
Jerry | s2 | 高二八班 | 馬云 |
Mike | s3 | 高三一班 | 劉東 |
我們在自然連接的結(jié)果集中,機上空值元組和沒有匹配到的元組:
姓名 | 學(xué)號 | 班級 | 班主任 |
---|---|---|---|
Jerry | s2 | 高二八班 | 馬云 |
Mike | s3 | 高三一班 | 劉東 |
高三五班 | 陳天 | ||
Jerry | s2 | ||
史柱 |
以上就是外連接的結(jié)果传轰,也叫做全外連接:保證兩端的元素不丟失剩盒。對應(yīng)的,還有左外連接和右外連接慨蛙,左外連接會保證左側(cè)的元素不丟失辽聊,右外連接會保證右側(cè)的元素不丟失。
因此上面兩個進行左外連接的結(jié)果為:
姓名 | 學(xué)號 | 班級 | 班主任 |
---|---|---|---|
Jerry | s2 | 高二八班 | 馬云 |
Mike | s3 | 高三一班 | 劉東 |
Jerry | s2 |
進行右外連接的結(jié)果為:
姓名 | 學(xué)號 | 班級 | 班主任 |
---|---|---|---|
Jerry | s2 | 高二八班 | 馬云 |
Mike | s3 | 高三一班 | 劉東 |
高三五班 | 陳天 | ||
史柱 |
除操作
除操作是對兩個關(guān)系進行“除法”操作股淡,要求“除數(shù)”關(guān)系是“被除數(shù)”關(guān)系的真子集身隐。除操作會從“被除數(shù)”關(guān)系中,選擇出一個新的關(guān)系唯灵,設(shè)為 N贾铝,N 也是 “被除數(shù)”關(guān)系的真子集。N 需要滿足一個條件:
N 和“除數(shù)”關(guān)系的笛卡爾積是“被除數(shù)”關(guān)系的最大真子集。
好繞啊···
我們還是直接看例子吧垢揩。
假設(shè)有兩個關(guān)系:R(A1,A2,A3)
和 S(A3)
:
A1 | A2 | A3 |
---|---|---|
a | b | c |
d | b | c |
a | e | c |
a | e | f |
d | b | f |
a | e | g |
a | e | h |
a | b | i |
A3 |
---|
c |
對 R 和 S 進行除操作玖绿,得到的結(jié)果為:
A1 | A2 |
---|---|
a | b |
d | b |
a | e |
如果 S 關(guān)系為:
A3 |
---|
c |
f |
那么對 R 和 S 進行除操作的結(jié)果為:
A1 | A2 |
---|---|
d | b |
a | e |
從上面的例子來看,除操作適用于“滿足全部····”的查詢叁巨。舉個例子斑匪,從學(xué)生表中查詢選擇了所有課程或者選擇了軟件測試和軟件工程這兩門課程的學(xué)生。
假設(shè)存在一個關(guān)系 R(學(xué)生)
和 S(課程)
:
姓名 | 學(xué)號 | 課程號 |
---|---|---|
Jerry | s2 | c2 |
Mike | s3 | c2 |
Carry | s4 | c1 |
Lucy | s5 | c3 |
課程名 | 課程號 |
---|---|
軟件工程 | c1 |
軟件測試 | c2 |
數(shù)據(jù)庫系統(tǒng)原理 | c3 |
現(xiàn)在我們要查詢選擇了軟件測試這門課的所有學(xué)生锋勺,則被除數(shù)關(guān)系為 R(學(xué)生)
蚀瘸,除數(shù)關(guān)系為:
課程號 |
---|
c1 |
對兩個關(guān)系進行除操作,得到的結(jié)果為:
姓名 | 學(xué)號 |
---|---|
Jerry | s2 |
Mike | s3 |
如果我們只需要獲取學(xué)生的姓名庶橱,不需要學(xué)號這一列贮勃,那么可以再對結(jié)果集進行投影操作:
姓名 |
---|
Jerry |
Mike |
總結(jié)
本文介紹了關(guān)系代數(shù)以及關(guān)系代數(shù)中常用的基礎(chǔ)操作和擴展操作,基礎(chǔ)操作包括并苏章,差寂嘉,笛卡爾積,選擇枫绅,投影泉孩,更名等,某些基礎(chǔ)要做要求兩個參與運算的關(guān)系具有并相容性并淋。擴展操作可以由基礎(chǔ)操作推導(dǎo)而來寓搬,可以完成更復(fù)雜的操作。
關(guān)系代數(shù)是 SQL 語言的基礎(chǔ)预伺,SQL 語言是在關(guān)系代數(shù)上的一層封裝订咸,目的是方便程序員使用曼尊。
關(guān)系代數(shù)的操作接受一個或多個關(guān)系作為輸入酬诀,再輸出一個新的關(guān)系,不同的關(guān)系操作可以進行相互的組合骆撇。例如可以先進行選擇操作再進行投影操作瞒御,先進行自然連接操作再進行選擇操作等等。根據(jù)不同的需求需要靈活的組合這些操作神郊。
完肴裙。