我一直在尝试完全理解sql联接的概念,venn图帮助我做了很多事情。我发现它们是为了各种各样的连接,但不是为了自然的连接。
用于自然连接的venn图会是什么样的呢?
发布于 2019-04-12 00:36:43
Venn图对于理解自然连接或内部连接并不是很有帮助。大多数与堆栈溢出上的联接相关的Venn图都是毫无价值的错误表示--即使在Venn图可能有用的情况下也是如此。
以下是用于SQL自然联接的Venn图的一些有效用法:
如果忽略列顺序,则区域可以是一个集合,其元素是关联表的列名。然后左右圆圈的元素是左右表的列名&组合元素是结果的列名。
如果同名的输入表列具有相同的类型,那么我们可以有一个区域是一个集合,其元素是出现在表中的公共列的子行值。然后左右圆圈的元素是左右表的这样的子行值&交叉元素是结果的子行值。
但是,无论是图还是对都没有告诉我们输出行是什么。
从我在Server 2008中的交叉连接与内部连接的回答来看
具有两个相交圆的Venn图可以说明相同输入的内部、左、右和完全联接的输出行之间的差异。当ON为无条件真时,内部连接结果与交叉连接相同。此外,它还可以说明INTERSECT & EXCEPT的输入和输出行。当两个输入都有相同的列时,相交结果与标准SQL自然联接的结果是相同的,而对于涉及左、右联接的某些成语来说,除了结果是相同的。但它并没有说明(内部)连接一般是如何工作的。乍一看,这似乎是可信的。它可以为ON、PKs (主键)、FKs (外键)和/或SELECT的特殊情况识别部分输入和/或输出。要看到这一点,你所要做的就是确定由圆圈所代表的集合的元素到底是什么。(令人困惑的演示文稿从来没有说清楚。)(请记住,对于联接,输出行通常与输入行有不同的标题。)
我强调地重申:
,但它确实说明了而不是一般是如何(内部)连接的。
要看到这一点,您所要做的就是识别circles.所表示的集合的元素,,,,到底是什么?
在我对答案的评论(在“传奇”的意义上使用“键”) re中,它的Venn图“图1”用于内部连接:
图1是解释联接的常见的可怕尝试。它的键也很复杂:它只用于表的集合&只等距连接&只有一个列;它还代表与输出不同的输入。一般情况下,写出来是为了加入。
从我对“内连接”和“外部连接”有什么区别?的评论
Venn图在集合中显示元素。只需准确地确定这些集合是什么以及这些图表中的元素是什么。集合不是表,元素不是它们的行。另外,任何两个表都可以连接,因此PKs和FKs是不相关的。都是假的。你在做成千上万其他人做过的事情--给人一个模糊的印象,你(错误地)认为这是有道理的。
在答案和注释下面的引用中,只有一个实际上解释了Venn图是如何表示操作符的:圆圈交集区域表示A JOIN B中的行集。每个圆圈的唯一区域表示您通过将其表中不参与A连接B的行,并将其他表的唯一列都设置为NULL而得到的行集。(而且大多数人都给出了A和B两种圆圈之间模糊的虚假对应)
因此,Venn图在某些情况下是相关的,在这种情况下,表可以合理地被认为持有一组行值元素。,但在一般情况下,SQL表不包含行值元素集,而Venn图表示集合.。
再通过Venn图说明内部连接与外部连接:
Re Venn图:如果没有空或重复行被输入,那么我们可以将一个表作为一组行值值&使用普通的数学=,那么Venn图就是可以容纳左、右连接输出表/集的行取圆圈。但是,如果输入了空行或重复行,那么很难解释圆圈是什么集合&这些集合与输入和输出表/包的关系如何,所以Venn图是没有帮助的。
来自我在回答“内连接”和“外部连接”的区别时,我的评论是什么?
我必须承认,尽管我在注释中使用了快速的措辞,因为SQL涉及书包和空值,而SQL区域性没有通用的术语来命名和区分相关的概念,即使清楚地解释Venn图的元素如何与输出“行”为1:1,更不用说输入“行”了,这也是非常重要的。或者内部或外部连接做什么,更不用说他们的区别了。" value“可能包含或不包括NULL,"row”可能是表值或变量中的值与槽的列表& "=“可能是SQL =”vs相等“。
https://stackoverflow.com/questions/55639641
复制相似问题