Sql连接操作

前言

在介绍一下的内容之前,先介绍两个表:R和S,内容如下:

表R

ABC
a1b11
a2b22
a3b23
a4b34

img

表S

BD
b15
b26
b47

img

笛卡尔积

两个表的笛卡尔积定义为:
R × S = { &lt; t , g &gt; ∣ t ∈ R A N D g ∈ S } R \times S = \{&lt;t,g&gt; \mid t \in R \quad AND \quad g \in S\} R×S={<t,g>tRANDgS}
即把两个表联系起来,列数为两表之和,行数为两表之积。
如上面的两个表做笛卡尔积得到下面的表

ABCBD
a1b11b15
a1b11b26
a1b11b47
a2b22b15
a2b22b26
a2b22b47
a3b23b15
a3b23b26
a3b23b47
a4b34b15
a4b34b26
a4b34b47

笛卡尔积的sql语句如下:

select * from R as r, S as s;

img

连接

连接操作定义如下:

R ⋈ &lt; 连 接 条 件 &gt; S = σ &lt; 连 接 条 件 &gt; ( R × S ) R\bowtie_{&lt;连接条件&gt;}S = \sigma_{&lt;连接条件&gt;}(R\times S) R<>S=σ<>(R×S)

连接即先做笛卡尔积,再在笛卡尔积生成的表上根据连接条件进行过滤。
笛卡尔积包含两个表之间的所有组合,连接只包含满足连接条件的组合。
没有连接条件的连接就是笛卡尔积。

连接条件为两关系中对应属性的比较,对应的属性不一定同名,但是类型要一样。
连接条件的普遍形式为:条件A and 条件2 and 条件3 … 条件k

其中每个条件的普遍形式为: A i θ B j θ ∈ { = , ≠ , &lt; , ≤ , &gt; , ≥ } A_{i} \theta B_{j}\quad \theta \in \{ =, \neq, &lt;, \le, &gt;, \ge\} AiθBjθ{=,̸=,<,,>,}

各种连接的概念

内连接

向上面用 = , ≠ , &lt; , ≤ , &gt; , ≥ =, \neq, &lt;, \le, &gt;, \ge =,̸=,<,,>,这种比较运算符判断条件的叫内连接。

即内连接包括等值连接,不等值连接,自然连接(可以看做特殊的等值连接)。

等值连接

如果所有的条件的 θ \theta θ都为 = = =,则这种连接称为等值连接。

如连接R和S中B列相等的值。

select * from S join R on S.B = R.B;

img

注意:

select * from S join R;

select * from S, R;

上面两句是等价的。两者都可以看成是两表之间的笛卡尔积。

自然连接

在等值连接的结果中,对应属性的值是相同的,没有必要重复列出,只在两个属性之间取一
个,这种消除冗余属性的等值连接称为自然连接。

如R和S的自然连接会去除重复的B这一列,并且比较B相等的值。
R和S自然连接的结果:

BDAC
b15a11
b26a22
b26a33

sql语句如下:

select * from S natural join R;

img

不等值连接

使用除了等号的其他运算符: &lt; , ≤ , &gt; , ≥ , ≠ &lt;, \leq, &gt;, \ge, \ne <,,>,,̸= 叫不等值连接

外连接

外连接是除了内连接的结果,还包括其中一个表或两个表的所有结果。具体理解看下面
每一类的说明。

外连接分为三类:左(外)连接,右(外)连接,全(外)连接。

左(外)连接(left join or left outer join)

左连接会从左表返回所有的行,即使与右表没有匹配。

如连接条件为R.B=S.B时的等值连接会返回三行,当为左连接时,
如R left join S,R的B=b3这一行一会返回,即使S中没有B=b3这一行。
由于S中没有B=b3这一行,S中的值就被赋值为NULL(数据库不同,值可能不同)。

select * from R left join S on R.B = S.B;

img

从上图可以看到,右表中不匹配的值为NULL

右(外)连接(right join or right outer join)

右连接与左连接相反,右连接会从右表中返回所有行,即使与左表不匹配。

直接看实例

select * from R right join S on R.B = S.B;

img

左连接和右连接的联系

相对的操作。直接看下面的代码

select * from R left join S on R.B = S.B;
select * from S right join R on R.B = S.B;

上面两句结果相同,交换两表的位置,把左连接变为右连接。

可以看到 S.B = b4在R中没有,但是还是返回结果,R中的值设为NULL。

全外连接(full join or full outer join)

全连接即两表的左连接与右连接的并集。

像mariadb没有全连接full join方法,就是用左连接并上右连接:left join union right join

select * from R left join S on R.B = S.B 
union 
select * from R right join S on R.B = S.B;

img

其他

交叉连接:网上有一些叫法,其实就是笛卡尔积,也是无条件连接。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值