关于tsql:SQL Server中的左联接与左外部联接

LEFT JOIN vs. LEFT OUTER JOIN in SQL Server

LEFT JOINLEFT OUTER JOIN有什么区别?


根据文档:来自(Transact-SQL):

1
2
3
<join_type> ::=
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

关键字OUTER标记为可选(用方括号括起来),在这种情况下,这意味着无论您指定与否都没有区别。请注意,尽管join子句的其他元素也被标记为可选,但将它们去掉当然会有区别。

例如,JOIN子句的整个类型部分是可选的,在这种情况下,如果只指定JOIN则默认为INNER。换句话说,这是合法的:

1
2
SELECT *
FROM A JOIN B ON A.X = B.Y

下面是等价语法的列表:

1
2
3
4
A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

另外,看看我在另一个问题上留下的答案:SQL左联接vs多个表在FROM行上?.

enter image description here


To answer your question there is no difference between LEFT JOIN
and LEFT OUTER JOIN, they are exactly same that said...

在顶层,连接主要有3种类型:

  • 十字架
  • 内部联接-如果两个表中都存在,则提取数据。

  • 外部连接有3种类型:

  • LEFT OUTER JOIN—如果左表中存在,则提取数据。
  • RIGHT OUTER JOIN—如果右表中存在,则提取数据。
  • FULL OUTER JOIN—如果两个表中的任何一个表中存在,则提取数据。
  • 交叉连接,顾名思义,是连接一切的[n X m]。类似于我们简单列出要加入的表的场景(在SELECT语句的FROM子句中),使用逗号将它们分开。

  • 注意事项:

    • 如果你只提到JOIN,那么默认情况下它是INNER JOIN
    • 一个OUTER连接必须是LEFTRIGHTFULL,你不能简单地说OUTER JOIN
    • 您可以删除OUTER关键字,只需说LEFT JOINRIGHT JOINFULL JOIN即可。

    对于希望以更好的方式可视化这些内容的用户,请访问以下链接:SQL联接的可视化解释


    What is the difference between left join and left outer join?

    没有什么。LEFT JOINLEFT OUTER JOIN是等效的。


    我是一个PostgreSQL DBA,据我所知,外部连接和非外部连接之间的区别是一个在互联网上引起广泛讨论的话题。直到今天,我才发现这两者之间有什么不同,所以我更进一步,试图找出两者之间的区别。最后,我阅读了有关它的全部文档,找到了答案,

    因此,如果您查看文档(至少在PostgreSQL中),您可以找到以下短语:

    "单词INNEROUTER在所有形式中都是可选的。默认为INNERLEFTRIGHTFULL表示外部联接。"

    换句话说,

    LEFT JOINLEFT OUTER JOIN相同

    RIGHT JOINRIGHT OUTER JOIN相同

    我希望这能对那些仍在努力寻找答案的人有所帮助。


    LEFT JOINLEFT OUTER JOIN是同一个。前者是后者的简称。关于Right JoinRight Outer Join的关系也可以这样说。示范将说明平等。每个查询的工作示例都是通过SQL fiddle提供的。此工具将允许手动操作查询。

    鉴于

    enter image description here

    左联接和左外联接

    enter image description here

    结果

    enter image description here

    右联接和右外联接

    enter image description here

    结果

    enter image description here


    我发现按以下顺序考虑连接更容易:

    • 交叉联接-两个表的笛卡尔积。所有连接都从这里开始
    • 内部连接-添加了过滤器的交叉连接。
    • 外部联接-缺少元素的内部联接(从左表或右表)之后添加。

    在我找到这个(相对)简单的模型之前,连接一直是一种黑色艺术。现在它们完全有意义了。

    希望这能帮助你,而不是让你困惑。


    为什么左/右和左外/右外相同?让我们解释一下这个词汇表的原因。请理解,左联接和右联接是外部联接的特定情况,因此不能是外部左/外部右联接以外的任何情况。外部联接也被称为完全外部联接,而不是外部联接的部分结果的左联接和右联接。的确:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
       1    |   5            1    |   1             1    |   1             1    |   1
       2    |   1            2    |   2             2    |   2             2    |   2
       3    |   6            3    |  null           3    |  null           -    |   -
       4    |   2            4    |  null           4    |  null           -    |   -
                            null  |   5             -    |   -            null  |   5
                            null  |   6             -    |   -            null  |   6

                          OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

    现在很清楚为什么这些操作有别名,而且很明显只有3种情况存在:内部、外部、交叉。外部有两个子案例。词汇表,老师解释这一点的方式,以及上面的一些答案,常常让人觉得有很多不同类型的连接。但其实很简单。


    回答你的问题

    In Sql Server joins syntax OUTER is optional

    它在msdn文章中提到:https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

    所以下面的列表显示了带有或不带有外部的连接等价语法

    1
    2
    3
    LEFT OUTER JOIN => LEFT JOIN
    RIGHT OUTER JOIN => RIGHT JOIN
    FULL OUTER JOIN => FULL JOIN

    其他等效语法

    1
    2
    INNER JOIN => JOIN
    CROSS JOIN => ,

    强烈推荐dotnet mob artie:加入SQL Serverenter image description here


    只有3个连接:

    • a)交叉连接=笛卡尔(例如:表A、表B)
    • b)内部联接=联接(例如:表A联接/内部联接表B)
    • c)外部连接:

      1
      2
      3
      4
         There are three type of outer join
         1)  Left Outer Join     = Left Join
         2)  Right Outer Join    = Right Join
         3)  Full Outer Join     = Full Join

    希望能有所帮助。


    连接主要有三种类型

  • 内部:获取两个表中都存在的数据
    • 只有连接意味着内部连接
  • 外部:有三种类型

    • 左外部提取仅在左表和匹配条件中存在的数据
    • 右外部提取仅在右表和匹配条件下存在的数据
    • 完整的外部提取数据显示任何或两个表
    • (左、右或全)外部联接可以写,不写"外部"
  • 交叉连接:将一切连接到一切


  • 句法上的甜言蜜语,让不经意的读者更清楚地认识到连接不是一个内在的连接。


    我知道这是旧的,但想把我的两分钱。我知道LEFT JOIN应该和LEFT OUTER JOIN一样,但在我的经验中,我看到LEFT JOIN收回了与LEFT OUTER JOIN不同的结果,所以我开始使用关键字OUTER来更加具体和恰当。本来应该放在LEFT JOIN中的行没有像我使用LEFT OUTER JOIN时那样出现在哪里。我正试图向一位同事解释这一点,当时他无法获得他需要的行,所以我决定谷歌差异,以便有某种支持来向他展示。这可能是我不确定的特定于SQL Server的事情。我会说,在良好的实践中,更明智的做法是显式地声明希望发生外部联接。只是我的意见。