join,中文在《資料庫系統工程師教程》中翻譯為串連,在《SQL server 編程必知必會》中翻譯為連接。為避免不一致,本文不進行翻譯,直接引用英文原詞JOIN.
關係模式,元組,屬性等術語出現於關係代數裡,而表,行,列等術語出現於SQL語言。本文統一使用更直接的SQL語言中的術語。
Join是關係運算中相當重要的運算子。其本質是把多個表中的行進行串連。而如何串連各個表中的行就成為不同join的分類依據。
參與join的表中,一般都包含能比較的列屬性。如何對這些屬性列進行比較就是不同join的標準。
設參與Join的兩個表為R(A,B,C),S(D,E,A)。
(1)根本不進行任何比較
這就是笛卡爾乘積,即對於每個表中的每一行,其他表中的任意行都與其進行串連。
在關係代數中記做:RXS
在SQL中,為select * from R, S
(2) θ Join
對於R中的每一行的參與比較的列與S表中的每一行對應的列進行比較,看是否滿足 θ。θ可以為大於,小於,等其他任何邏輯運算子。
例如要比較的是R.A和S.A,標準是R.A > S.A。
關係代數中記為:R(呵呵還不會輸入)S
SQL中:select * from R inner join S on R.A > S.A
運算原理為:對於R中的每一行,遍曆S中的全部行,並進行R.A > S.A比較,如果滿足,則把S中的行與R中的當前行串連為一個新
行,並插入結果表中。如果不滿足,則丟棄。
(3)等值Join
當θ Join中的θ為相等測試時,則變成了等值Join.其實關係運算中絕大部分的Join為等值Join。
在SQL中:select * from R inner join S on R.A = S.A
(4)自然Join
等值Join後得到的表中會出現重複的列, 如R.A和S.A同時出現,而這兩個列是完全相同的,所以沒必要重複。如果將重複的列
去掉,那麼等值Join就變成了自然Join。
在SQL中:select R.A, R.B, R.C, S.D, S.E from R inner join S on R.A=S.A
(5)外串連outer join
(2)-(4)均成為inner join。inner join存在的問題就是丟棄所有不滿足條件的行。比如對於R中的第i行,如果S中的所有行都不能與其進行串連,那麼R的i行將不會出現在結果表中。又如,對於S的第i行,如果此行對於R中的任意行都不滿足比較條件,則也不會出現在結果表中。
為了防止丟失R中的i行,此時將強行把第i行加入結果表中,並且在本來應該填入S列的地方全部填入NULL。此時這種串連成為
left outer join。即把本來要丟棄的左邊的表中的行加入結果表中。
同樣道理,把本來要丟棄的右邊表中的行加入結果表中則成為right outer join.
在SQL中記為:select R.A, R.B, R.C, S.D, S.E from R left outer join S on R.A=S.A
select R.A, R.B, R.C, S.D, S.E from R right outer join S on R.A=S.A
如果為了防止丟失R和S中的行,則使用 full outer join.也就是把left outer join 和 right outer join結合。
在SOL中好像沒有對應全外串連的關鍵詞。