所以我看了一些图以了解联接之间的区别,然后我看到了这张图片:
也许问题在于用维恩图表示。但是,从左上角的第一个联接开始,基本上不是A吗? B在那有什么区别?
编辑:https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/
这个网站解释得很好
答案 0 :(得分:4)
不,这是联接。如果B中有多行,那么A中的一行将显示多次。
示例:
表A:
id name
-- -------
1 Alice
2 Malcolm
3 Kelly
表B:
id_a preferred food
---- --------------
1 Pizza
2 Burger
2 Steak
2 Menestroni
然后“ A左连接B”将为您提供:
id name id_a preferred food
-- ------- ---- --------------
1 Alice 1 Pizza
2 Malcolm 2 Burger
2 Malcolm 2 Steak
2 Malcolm 2 Menestroni
3 Kelly null null
简而言之:
3 Kelly
也出现。3 Kelly
在最后两列中有null
个值。2
会出现3次。答案 1 :(得分:2)
您的图不是维恩图。
两个圆的相交表示来自表A和表B的数据(根据您的联接条件)的联接行。
左新月形(标记为“ A”)表示表A中的行,而表B中没有任何对应的行;右边的新月形(标记为“ B”)表示表B中的行,而表A中没有任何对应的行。
左上图应该显示的是,左联接为您提供了表A和B中的数据,这些数据可以根据您的联接条件进行联接,加上表A中所有与表中没有对应匹配项的行B。
答案 2 :(得分:0)
使用JOIN,您可以从两个表中获得字段,而不仅仅是A。 如果表之间的关系不是1-1,它还会乘以返回的记录数。
基本上,所有这些JOIN之间的唯一区别是A中的记录与B中的任何记录都不匹配时的行为,反之亦然。您的图表仅显示该行为。
Diagram top let =保留A中的所有记录,无论它们是否与B中的任何内容匹配(+未表示的内容:当它们匹配时,从B中获取数据)。
答案 3 :(得分:0)
左联接B表示A +(在B中存在的公共项)左联接将执行,而在这种情况下,左联接的表在此情况下具有更多记录,并且那些记录可能引用了其他一些列B在某些常见条件下。因此,如果需要对A和B的某些通用值,则结果A左连接B不仅意味着A,而且还添加了B的列。
答案 4 :(得分:0)
在该图中,他们从该描述中省略了“外部”一词,但您应将其读为LEFT OUTER JOIN
。
SQL语句“左侧”的表(将是FROM后面的表,在本例中为表A)将返回每一行,无论表B中是否有对应的行符合JOIN条件。
这是内部联接和外部联接之间的区别。内部联接仅返回联接条件匹配的行,而LEFT OUTER联接返回INNER联接返回的相同行,以及LEFT表中不满足以下条件的任何行的ROW加入条件。对于LEFT表中未联接到表B中的一个或多个行的那些行,可能在SELECT中指定的表B的列将为NULL。
您可以看到,直接在下面的示例中使用表B列的值为NULL的不匹配LEFT行的此属性来过滤掉从成功连接到表B衍生的任何行。