最简单易懂的 SQL JOIN 图文解释

浏览: 2433
我认为 Ligaya Turmelle 的关于SQL联合(join)语句的帖子对于新手开发者来说是份很好的材料。SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。不过正如在她的帖子的回复中所说的,在测试中我发现韦恩图并不是十分的匹配SQL联合语法。

不过我还是喜欢这个观点,所以我们来看看能不能用上韦恩图。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。
QQ截图20150720122745.png

我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。

内联合(inner join)
QQ截图20150720122830.png

内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)
未命名-14.png

全外联合(full outer join)
QQ截图20150720122931.png

全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)
未命名-15.png

左外联合(left outer join)
QQ截图20150720123026.png

左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)
未命名-16.png

左外联合,然后用where语句排除一边我们不想要的记录
QQ截图20150720123119.png

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)
未命名-17.png

全外联合,然后用where语句排除两边都不想要的记录
QQ截图20150720123217.png

为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)
未命名-18.png

交叉联合(cross join)
还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:
QQ截图20150720123317.png

这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。

总结图

下图由 Moffatt 在 2008 年制作 PS:Jeff Atwood 的文章写于 2007 年。
未命名-19.png

原文来自:伯乐在线

未命名-3.png
未命名-4.png

 
 
推荐 2
本文由 simon_li0908 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

4 个评论

图太抽象了,这一个圈、那一个圈的,还是直接把表数据拿出来看更直观 - -
没,觉得图挺直接的
那是你比较厉害 如果我作为初学者
举个例子 左外连接完全看不出主从之间的关系是什么 只能看出主表全展现,没看出来从表字段为空的情况,一个圈无法代表一个表 表里还是有关联字段和展现字段的区分的 除非他这是全部展示的意思
这图对于全不会的人基本没用,对于都懂的也没用,就对于知道怎么回事的然后不知道怎么给不会的讲的,有用

要回复文章请先登录注册