对联接的理解被打破了。 待续。 尝试替代可视化

你们中的许多人已经阅读了上一篇有关不正确的可视化如何解释JOIN如何工作的文章 ,在某些情况下可能会造成混淆。 维恩圆不能完全说明某些点,例如,如果重复表中的值。

在准备录制《 锌产品》播客的第六期(我们同意讨论该文章)时,看来我设法找到了一个有趣的可视化版本。 此外,在原始文章的评论中也提供了类似的选项。


每个人都受到邀请


因此,可视化。 正如我们在上一篇文章的评论中发现的那样,join不仅仅是笛卡尔乘积,而是交集。 如果看一下笛卡尔积的显示方式,您会注意到它通常是一个矩形表,其中第一个关系沿着一个轴,第二个关系沿着另一个轴。 因此,表的元素将是所有内容的所有组合。


很难抽象地绘制它,因此它必须是一个示例。


假设我们有两个表。 在其中之一


id -- 1 1 6 5 

在另一个:


 id -- 1 1 2 3 5 

立即免责声明:我将字段简称为“ id”一词。 上一篇文章中的许多内容都是令人愤慨的-重复出现,令人感到羞耻。 不用太担心
例如,想象一下,这是一个包含每日统计信息的表,其中每天和每个用户都有访问网站的数据。 一般来说,不是重点。


因此,我们想找出各种表联接会发生什么。 让我们从CROSS JOIN开始:


交叉加入


 SELECT t1.id, t2.id FROM t1 CROSS JOIN t2 

CROSS JOIN是可以从两个表中接收的所有可能的组合。


可以如下所示:在x轴上-一张桌子上,在y轴上-另一张桌子上的所有单元格(以橙色突出显示)-这就是结果



内联接


INNER JOIN(或仅JOIN)是相同的CROSS JOIN,仅具有那些满足“ ON”构造中写入条件的元素。 注意记录重复时的情况-将有四个结果单位。


 SELECT t1.id, t2.id FROM t1 INNER JOIN t2 ON t1.id = t2.id 


左联接


LEFT OUTER JOIN(或仅LEFT JOIN)与INNER JOIN相同,但此外,我们为第一个表中的行添加了null,而在第二个表中未找到任何内容


 SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.id = t2.id 


正确加入


RIGHT OUTER JOIN(或RIGHT JOIN)与LEFT JOIN相同,相反。 即 对于第二个表中的行,这是INNER JOIN + null,在第一个表中未找到任何内容


 SELECT t1.id, t2.id FROM t1 RIGHT JOIN t2 ON t1.id = t2.id 


→您可以在此处处理请求


结论


这似乎是一个简单的可视化。 尽管有局限性:它显示了将相等性写在ON中的情况,而不是棘手的事情(任何布尔表达式)。 另外,未考虑表值之中为空的情况。 即 这仍然有些简化,但事实证明它比维恩圈子更好,更准确。


订阅我们的Zinc Prod播客,在这里我们讨论数据库,软件开发和其他有趣的事情。

Source: https://habr.com/ru/post/zh-CN450528/


All Articles