使用维恩图描述表所在的SQL连接是否合适?

时间:2020-05-08 18:18:32

标签: sql join inner-join outer-join

通过在Internet上搜索SQL连接可以找到以下图像:

enter image description here

我们可以通过以下方式将其解释为Venn diagram吗?

  • 标记为表A的圆圈是表A中的记录集
  • 标记为表B的圆圈是表B中的记录集
  • 集合的交集表示内部联接(也就是SQL中的联接)

动机

所示的图以各种形式广泛地出现在网上,看起来非常像维恩图。因此,第一个直觉是将其视为维恩图。但是,尝试定义“表A”和“表B”集的内容可能会陷入困境。

Internet上也有一些似乎冲突的信息。这个问题希望有助于解决一些冲突。一些网站认为我们不应该使用维恩图来解释联接:

虽然还有其他信息在表A和B之间使用维恩图来解释这些表上的联接,例如

1 个答案:

答案 0 :(得分:1)

不。如果该图表示联接,则不能将其解释为维恩图。让我们用一个反例来说明为什么。让我们选择一个最小的反例以避免混乱。因此,我们假设两个表都只有一列:ID。此外,我们假设两个表中都只有两个记录,并且它们都具有相同的两个记录:只有ID 1和2。所以两个表都看起来像这样:

enter image description here

现在,假设我们运行以下SQL:

select * from A join B

由于没有ON子句,我们将返回A中所有记录组合和B中所有记录的表。由于每个记录都有2条记录,因此我们将返回4 = 2 * 2条记录。选择后的结果表将如下所示,其中A和B的ID列完全由表名限定:

enter image description here

但是,无论我们为记录选择何种解释,维恩图中描绘的两组记录的交集都不等于此。

解释#1::每条记录只是值的元组。在这种情况下,由于每个表中只有一列,因此元组可以简化为单个值。由于我们的ID列是数字,因此这种解释可以归结为仅是数字ID的记录。集的交集是集{1, 2}与自身的交集。这只是原始设置。或作为表格,交点为:

enter image description here

解释#2:表A中的每个记录与表B中的任何记录或表A本身中的任何其他记录完全不同。在这种情况下,由于没有两个记录相同,因此这两个集合的交集将为空,即为空集合。因此,作为表,它肯定不会与联接的结果相同。

这得出证明不能完全认为维恩图的这种精确解释表示SQL连接的证明。

相关问题