left join 多条件_[SQL] 当我们join数据时,到底发生了什么?一文让你不再混淆各种join...

a1df5bbedb1f00ed75dfdf8cc87370d4.png

本文从笛卡尔积出发,介绍SQL在 join 时数据是怎样组合和筛选来获得结果的,

帮助你理清join、left join、right join、full join等各类不同join的差异。


笛卡尔积

首先,让我们了解一下join中涉及到的重要概念,笛卡尔积。

两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,是第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 。

现在,我们有两个集合A和B。

A = {0,1} ,B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析我们可以得出以下两点结论:

1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数。


join解析

假设,我们有table_a和table_b两个表,如图所示。

303b37cf62abfb24b3a2676a1f565956.png

下面我们来看一下不同类型的 join下,到底发生了什么。

1. Inner Join / Join

select 

首先,我们分别为table_a与table_b添加一个空行,

c68c6fcc371db33f000da50678bc4eb6.png

接下来,作出table_a’和table_b’的笛卡尔积,

b4062c56d40d52252bdcb8f83d50a78e.png

最后一步就非常简单了,那就是,筛选出上表中满足on条件的部分,即id_a = id_b,

27c49416cd9115fa36ba74107320a928.png

可能有同学奇怪,为什么id_a 、 id_b均为NULL的数据为什么没有被选出呢?

这是因为在SQL中,null代表什么都不是,用“=、>、< ...” 所有的判断,结果都是false。

2. Left Join

select * 
from table_a a 
left join table_b b 
on a.id = b.id;

首先,仍然是为table_a与table_b添加一个空行,并做笛卡尔积,

但最后一步中,我们不仅筛选出符合id_a = id_b条件的数据,还会筛选出table_a’未关联到table_b’的数据。

b7831e792827d11ef4286f1997c49379.png

2. Right Join

select * 
from table_a a 
right join table_b b 
on a.id = b.id;

与left join类似,做出笛卡尔积后,筛选出符合id_a = id_b条件的数据,和table_b’未关联到table_a’的数据。

77579d4ea2d8f0d0e05f291909edff4c.png

2. Full Join

select * 
from table_a a 
full join table_b b 
on a.id = b.id;

full join的结果为left join、right join的并集,做出笛卡尔积后,筛选出符合id_a = id_b条件的数据、table_a’未关联到table_b’的数据和table_b’未关联到table_a’的数据。

3abe9aa601766e4d3a2269b27ddcad3c.png

获取更多精彩,获取免费学习资料,请关注公众号​:Ray的数据分析自习室(ID:Ray_DAclass)


想看更多?

互联网数据分析​zhuanlan.zhihu.com
dd2d297ddb407a4dbcc4cd14e1662bb3.png
RAYW:不懂统计和数据分析讲的是什么?看这篇就够了​zhuanlan.zhihu.com
6b43f09eccb8c63d1ef01a1257bedc72.png
RAYW:100+个数据分析常用指标和术语,值得收藏​zhuanlan.zhihu.com
c3d1357d8fe34b3e84abd72eccfdbbb0.png
RAYW:不懂LTV,怎么敢做用户增长?详解用户生命周期价值计算方法​zhuanlan.zhihu.com
2653ba556ca8f768652b6d6969348e97.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值