网上搜索SQL join可以找到下图:
我们可以将其解释为维恩图,通过以下方式?
- 标记为表 A 的圆圈是表 A 中的记录集
- 标记为表 B 的圆圈是表 B 中的记录集
- 集合的交集表示内连接(也称为 SQL 中的连接)
动机
所示的图表在网络上以各种形式广泛出现,看起来非常像维恩图。因此,第一直觉是将其视为维恩图。然而,在尝试定义“表 A”和“表 B”集的内容时可能会遇到困难。
互联网上也有一些信息似乎存在冲突。这个问题希望能帮助解决一些出现的冲突。一些网站认为我们不应该使用维恩图来解释连接:
- https://towardsdatascience.com/can-we-stop-with-the-sql-joins-venn-diagrams-insanity-16791d9250c3
- https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/
虽然还有其他信息使用表 A 和 B 之间的维恩图来解释这些表上的联接,例如
- “内连接”和“外连接”有什么区别?
- 用维恩图回答该问题的版本
不可以。如果该图要表示连接,则不能将其解释为维恩图。让我们用一个反例来说明原因。让我们选择一个最小的反例以避免混乱。因此,我们假设两个表都只有一列:ID
。此外,我们假设这两个表中都只有两条记录,并且它们都有相同的两条记录:只有 ID 1 和 2。所以这两个表看起来都是这样的:
现在,假设我们运行以下 SQL:
select * from A join B
既然没有ON
子句,我们将返回所有记录组合的表A
所有记录都在B
。由于每条记录都有 2 条记录,因此我们将返回4 = 2 * 2
记录。我们的选择结果表将如下所示,其中 A 和 B 的 ID 列由表名称完全限定:
然而,无论我们为记录选择什么解释,两组记录的交集(如维恩图所示)都不等于这个。
解释#1:每条记录只是一个值的元组。在本例中,由于每个表中只有一列,因此我们的元组归结为单个值。由于我们的 ID 列是数字,因此这种解释可以归结为记录只是一个数字 ID。集合的交集就是集合的交集{1, 2}
与它自己。这只是原始集。或者作为表格,交集将是:
解释#2:表 A 中的每条记录都与表 B 中的任何记录完全不同,或者实际上与表 A 本身中的任何其他记录完全不同。在这种情况下,由于没有两条记录是相同的,因此两个集合的交集将为空,即空集。所以作为一个表,它肯定不会与连接的结果相同。
这证明了维恩图的这种精确解释不能被视为表示 SQL 连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)