数据库工程师考试自学(3)---关系运算之连接

本文详细介绍了SQL中的JOIN操作,包括笛卡尔乘积、θJoin、等值Join、自然Join及外连接等概念。通过实例说明了不同JOIN类型在SQL中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值