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中好像没有对应全外连接的关键词。