SQL连接作为维恩图(sql joins as venn diagram)

2019-07-17 12:27发布

我有麻烦理解SQL连接并在这个形象,我认为可能会帮助我来了。 问题是,我不完全理解。 例如,加入图像,其色彩的上限B圈红,但只有从重叠A.图像使它看起来像圆B是sql语句的主要焦点的右上角,但SQL语句本身,通过具有启动(选择A,加入B),传达了相反的印象给我,即A将是SQL语句的焦点。

同样,下面的图像仅包括从B圈数据,所以为什么一个包含在连接语句呢?

问:从右上角顺时针工作和中心整理,有人可以提供关于每个SQL图像的表示的更多信息,解释

一)为什么加入将在每种情况下有必要(例如,特别是在从A或B即只有A或B采取任何数据的情况下,但不能同时是有色)

b)和,将澄清的任何其它细节为何图像是sql的良好表示

Answer 1:

我觉得你的主要潜在的困惑是,当(例如)仅A以红色突出显示,你正在做的是指“查询仅从数据返回A ”,但实际上它的意思是“查询只对那些返回数据情况下, A有记录 ”。 查询可能仍包含从B.数据(对于情况下, B 没有一个记录,查询将取代NULL )。

同样,下面的图像仅包括从B圈数据,所以为什么一个包含在连接语句呢?

如果你的意思是-在图像A完全是白色的,并有一个红色月牙形状的一部分B不与重叠的A ,那么:其原因A出现在查询, A是如何找到在记录中B需要被排除在外。 (如果A没有在查询中出现,然后维恩图不会有A ,它只会显示B ,而且会是没有办法区分了不想要的所需的记录。)

图像使它看起来像圆B是sql语句的主要焦点,但SQL语句本身,通过具有启动(选择A,加入B),传达了相反的印象给我,即A将成为焦点的SQL语句。

完全正确。 出于这个原因, RIGHT JOIN s为比较少见的; 虽然它使用的查询LEFT JOIN几乎总是可以重新排序使用RIGHT JOIN代替(反之亦然),通常人们会写他们与查询LEFT JOIN ,而不是与RIGHT JOIN



Answer 2:

我同意凯德关于维恩的局限性图在这里。 一个更贴切的视觉表现可能是这一点。

选择A.Colour,B.Colour从跨JOIN B SQL小提琴

交叉联接(或笛卡尔积)产生与来自这两个表中的行的每个组合的结果。 每个表有4行,以便这产生在结果16点的行。

SELECT A.Colour,B.Colour从INNER JOIN乙ON A.Colour = B.Colour SQL小提琴

内加入逻辑返回从交行的所有参加那场比赛的连接条件。 在此为五个做。

SELECT A.Colour,B.Colour FROM ON A.Colour NOT IN( '绿', '蓝')甲INNER JOIN乙SQL小提琴

内连接条件不必是相等的条件,它不需要从两个(或甚至要么)引用列的表。 评估A.Colour NOT IN ('Green','Blue')在十字架上的每一行联接返回。

内部连接的条件1=1将评估为true,在跨每一行加入使这两者是等价( SQL小提琴 )。

SELECT A.Colour,B.Colour从左侧OUTER JOIN乙ON A.Colour = B.Colour SQL小提琴

外连接以同样的方式在逻辑上评价为内连接不同的是,如果左表行(左连接)不从右手表中的任何行,在所有它与结果保存加入NULL的值右手列。

SELECT A.Colour,B.Colour从左侧OUTER JOIN乙ON A.Colour = B.Colour WHERE B.Colour IS NULL SQL小提琴

这只是限制了先前的结果只返回其中的行B.Colour IS NULL 。 在这种特殊情况下,这些将是因为他们没有匹配在右手表和查询返回的单红排在表中没有匹配的是被保存下来的行B 。 作为抗半加入这是已知的。

以选择一列是很重要的IS NULL测试要么是不可为空或该连接条件确保任何NULL值将被排除在外,以便该模式才能正常工作,避免只是带回其中恰好有一个行NULL对于除未匹配的行的列值。

SELECT A.Colour,B.Colour从右OUTER JOIN乙ON A.Colour = B.Colour SQL小提琴

右外连接的作用类似于左外连接,除了它们右表中保留非匹配的行和空延长左手列。

SELECT A.Colour,B.Colour从全OUTER JOIN B ON A.Colour = B.Colour SQL小提琴

完全外连接相结合的左侧行为和正确的连接和来自左翼和右翼表都保存不匹配的行。



Answer 3:

维恩图适合于表示一组操作,如UNION,相交,除非等

要只类似,但进行了模拟的东西像LEFT这些组操作JOIN WHERE rhs.KEY是空的程度,这个图是准确的。

否则,它是一种误导。 例如,任何连接可以导致行繁殖,如果连接标准不是1:1。 但集只允许包含独特成员,所以这些不能被表示为一组操作。

再有就是CROSS JOIN或INNER JOIN ON 1 = 1 - 这既不是类似于INNER JOIN如该图所示,也不可能被真正通过维恩图中描述制备的集。 且不说其他所有可能的三角形联接,自我和抗加入,如:

lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)

要么

SELF self1
INNER JOIN SELF self2
    ON self2.key <> self1.key
    AND self1.type = self2.type

(自交和反联接查找所有类似的家庭成员除了你自己 - self1和self2是同一组,结果是真子集)

坚持上键连接可能是罚款的教程的前几分钟,但是这可能会导致较差的路径学的东西连接是什么。 我觉得这是你有什么发现。

这种想法,维恩图可以代表一般的JOIN这样需要走。



Answer 4:

当你做一个加入,很可能是你的两个表可能不匹配完美。 具体而言,有可能在一个某些行不匹配任何东西在B,或在比赛中了B中的单个行重复的行,反之亦然。

发生这种情况时,你有一个选择:

  1. 对于每个A,取该作品,如果有一个单乙。 (左上)
  2. 取每个完全匹配对(丢弃任何缺失的A或B - 中心)
  3. 对于每个B,采取一个可行的单个A,如果有一个(右上)
  4. 采取一切(左下)

中心左和右是技术上的连接,但毫无意义的人; 他们也许可以被更有效地写入SELECT <select_list> FROM TableA A WHERE A.Key NOT IN (SELECT B.Key FROM TableB B)或相反)。

在直接回答你的困惑, RIGHT JOIN说,“下面的表达式是该查询的重点”。 右下方是比较奇怪,我看不出有任何理由你想要的。 它返回来自两个外侧中间查询,以混在一起的结果NULL的所有列的针对相反表。



Answer 5:

对于正确的加入,是语法可能会造成混淆,但肯定它是什么它似乎是。 当你说“表A RIGHT JOIN表B”,这的确是说,表B是,你是指和表A只是挂在那里它匹配的记录主表。 这并读取查询奇怪,因为表A中首先列出让你的大脑更优先自动分配给它,即使表B是真的在查询更重要的表。 出于这个原因,你很少实际看到真正的代码右连接。

因此,而不是A和B,让我们两件事情,很容易跟踪。 假设我们有一个人的信息,ShoeSize和智商两个表。 您有一些人ShoeSize信息,对某些人某些智商信息。 并有两个表,你可以加入一个是PersonID。

顺时针方向右上方(即使寿这与一些更复杂和人为的情况下开始):

  • ShoeSize RIGHT JOIN智商 - >给我所有的IQ的信息。 包括为这些人的任何信息ShoeSize如果我们拥有它。
  • ShoeSize RIGHT JOIN IQ WHERE ShowSize.PersonID = NULL - >给我所有的智商信息,但只有人没有任何鞋码信息谁
  • ShoeSize FULL OUTER JOIN IQ WHERE ShoeSize.PersonID = NULL AND IQ.PersonID = NULL - >给我只为没有智商信息的人谁的鞋码信息,再加上IQ信息对于那些没有鞋码信息的人谁
  • ShoeSize FULL OUTER JOIN智商 - >给我的一切,所有的鞋号和所有的IQ数据。 如果有任何ShoeSizes和智商记录具有相同的是PersonID,包括他们在一排。
  • ShoeSize LEFT JOIN IQ WHERE IQ.PersonID = NULL - >给我所有的鞋码的信息,但仅适用于不具备IQ信息的人
  • ShoeSize LEFT JOIN智商 - >给我所有的鞋码信息的。 包括为这些人智商的任何信息,如果我们有它。


文章来源: sql joins as venn diagram