SQL Server中的LEFT JOIN与LEFT OUTER JOIN

时间:2009-01-02 08:30:10

标签: sql-server tsql left-join outer-join

LEFT JOINLEFT OUTER JOIN之间的区别是什么?

12 个答案:

答案 0 :(得分:2059)

根据文档:FROM (Transact-SQL)

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

关键字OUTER被标记为可选(括在方括号中),在这种情况下,这意味着无论您是否指定它都没有区别。请注意,虽然join子句的其他元素也标记为可选,但将它们排除在外当然会产生影响。

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

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

以下是等效语法列表:

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 left join vs multiple tables on FROM line?

enter image description here

答案 1 :(得分:670)

  

要回答您的问题,LEFT JOIN之间没有区别   和LEFT OUTER JOIN,它们完全相同表示......

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

  1. INNER
  2. OUTER
  3. CROSS

    1. INNER JOIN - 如果两个表中都有数据,则会提取数据。

    2. 外部加入属于 3 类型:

      1. LEFT OUTER JOIN - 获取左表中的数据。
      2. RIGHT OUTER JOIN - 如果右表中有数据,则提取数据。
      3. FULL OUTER JOIN - 获取两个表中任何一个表中的数据。
    3. CROSS JOIN ,顾名思义,[n X m]将所有东西都加入到所有内容中。
      与我们只是列出要加入的表(在FROM语句的SELECT子句中)的情况类似,使用逗号分隔它们。


    4. 需要注意的要点:

      • 如果您只提及JOIN,则默认情况下为INNER JOIN
      • OUTER加入必须为LEFT | RIGHT | FULL您不能简单地说OUTER JOIN
      • 您可以删除OUTER个关键字,只需说出LEFT JOINRIGHT JOINFULL JOIN

      对于那些想要以更好的方式想象这些内容的人,请访问以下链接: A Visual Explanation of SQL Joins

答案 2 :(得分:328)

  

左连接和左外连接有什么区别?

<强>没有即可。 LEFT JOINLEFT OUTER JOIN相同。

答案 3 :(得分:62)

我是PostgreSQL DBA,据我所知,外部或非外部联接之间的区别差异是一个在互联网上有相当多讨论的话题。直到今天,我从未看到过这两者之间的差异;所以我走得更远,我试图找到它们之间的区别。 最后,我阅读了有关它的整个文档,我找到了答案,

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

"The words INNER and OUTER are optional in all forms. INNER is the default; LEFT, RIGHT, and FULL imply an outer join."

换句话说,

LEFT JOINLEFT OUTER JOIN是相同的

RIGHT JOINRIGHT OUTER JOIN是相同的

我希望它能为那些仍在努力找到答案的人做出贡献。

答案 4 :(得分:55)

Left JoinLeft Outer Join是一个,相同。前者是后者的简写。关于Right JoinRight Outer Join关系也可以这样说。示威将说明平等。每个查询的工作示例都是通过 SQL Fiddle 提供的。该工具将允许动手操作查询。

<强>鉴于

enter image description here

Left JoinLeft Outer Join

enter image description here

<强>结果

enter image description here

Right JoinRight Outer Join

enter image description here

<强>结果

enter image description here

答案 5 :(得分:38)

我发现按以下顺序更容易想到联接:

  • CROSS JOIN - 两张桌子的笛卡尔积。所有联接从这里开始
  • INNER JOIN - 添加了过滤器的CROSS JOIN。
  • OUTER JOIN - 缺少元素的内部联接(来自LEFT或RIGHT表) 之后补充说。

直到我弄清楚这个(相对)简单的模型,JOINS总是更像一个黑色艺术。现在他们完全有道理。

希望这有助于解决问题。

答案 6 :(得分:28)

为什么LEFT / RIGHT和LEFT OUTER / RIGHT OUTER相同?让我们解释为什么这个词汇。 理解LEFT和RIGHT连接是OUTER连接的特定情况,因此不能是OUTER LEFT / OUTER RIGHT以外的任何其他连接。 OUTER联接也称为 FULL OUTER,而不是OUTER联接的 PARTIAL 结果的LEFT和RIGHT联接。事实上:

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种情况:INNER,OUTER,CROSS。有两个子案例用于OUTER。 词汇,教师解释这一点的方式,以及上面的一些答案,往往使它看起来有很多不同类型的连接。但实际上非常简单。

答案 7 :(得分:21)

回答你的问题

  

在Sql Server连接语法 OUTER 是可选的

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

以下列表显示了使用和不使用 OUTER

的连接等效语法
LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

其他等效语法

INNER JOIN => JOIN
CROSS JOIN => ,

强烈推荐Dotnet Mob Artice:Joins in Sql Server enter image description here

答案 8 :(得分:18)

主要有三种类型的JOIN

  1. 内部:获取两个表中存在的数据
    • 只有JOIN表示INNER JOIN
  2. 外面:有三种类型

    • LEFT OUTER - - 仅提取左表中显示的数据&amp;匹配条件
    • RIGHT OUTER - - 获取仅在右表中显示的数据&amp;匹配条件
    • FULL OUTER - - 提取任何或两个表格中的数据
    • (LEFT或RIGHT或FULL)OUTER JOIN可以写成“OUTER”
  3. 交叉加入:将所有内容加入到所有内容中

答案 9 :(得分:18)

只有3个连接:

  • A)交叉连接=笛卡儿(例如:表A,表B)
  • B)内连接=连接(例如:表A连接/内连接表 B)
  • C)外部联接:

       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    
    

希望它有所帮助。

答案 10 :(得分:14)

句法糖,让随意的读者更明显地认为连接不是内在的。

答案 11 :(得分:1)

就此问题而言,我也想发布2个“ APPLY”运算符:

加入

  1. 内部联接 = JOIN

  2. 外部加入

    • 左外联接=左联接

    • 正确的外部联接=正确的联接

    • 完全外部联接=完全联接

  3. 交叉加入

SELF-JOIN :这不是完全独立的联接类型。这基本上是使用以上联接之一将表联接到自身。但是我觉得在上下文JOIN讨论中值得一提,因为您会在SQL Developer社区的许多人那里听到这个术语。

应用

  1. 交叉应用-与INNER JOIN相似(但具有能够为Left表的每一行计算Right表中的内容并且仅返回匹配行的优点)
  2. 外部应用-与LEFT OUTER JOIN相似(但具有以下优点:能够为Left表的每一行计算Right表中的内容,并会返回Left的所有行表格,而与右侧表格上的匹配无关)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Real life example, when to use OUTER / CROSS APPLY in SQL

我发现APPLY运算符非常有好处,因为与在子查询中进行相同的计算相比,它们提供了更好的性能。它们还替代了旧版SQL Server中的许多分析功能。这就是为什么我相信在对JOINS感到满意之后,一名SQL开发人员应该尝试接下来学习APPLY运算符。