SQL A是否不是左联接B,而是A?

时间:2018-12-27 18:16:36

标签: sql join left-join

所以我看了一些图以了解联接之间的区别,然后我看到了这张图片:

enter image description here

也许问题在于用维恩图表示。但是,从左上角的第一个联接开始,基本上不是A吗? B在那有什么区别?

编辑:https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/

这个网站解释得很好

5 个答案:

答案 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

简而言之:

  • A中的所有行都显示在左联接中:甚至3 Kelly也出现。
  • 如果B中没有匹配的行,则B中的列将显示为空值:行3 Kelly在最后两列中有null个值。
  • A中的行在B中具有多个匹配项时可能会出现多次:行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衍生的任何行。