SQL Server中的LEFT JOIN与LEFT OUTER JOIN

KG *_*osa 1514 t-sql sql-server left-join outer-join

LEFT JOIN和之间有什么区别LEFT OUTER JOIN

ang*_*son 2158

根据文档:FROM(Transact-SQL):

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT *
FROM A JOIN B ON A.X = B.Y
Run Code Online (Sandbox Code Playgroud)

这是一个等效语法列表:

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
Run Code Online (Sandbox Code Playgroud)

另外看看我在另一个问题上留下的答案:SQL左连接与FROM线上的多个表?.

在此输入图像描述

  • 完全正确.OUTER允许ANSI-92兼容性. (123认同)
  • @Outlier这是你的特权,但很明显其他人认为答案是好的.说实话,如果一个答案说X和另一个答案说X并引用文档,并将相关的文档部分复制到答案中,我的投票转到第二个答案,这就是我写答案的原因我做.有人*声称*X不好.如果你能*证明*X,那就更好了(不要轻视sactiw的回答).但是,无论你想做什么,你都有自己的特权.我怀疑为什么你认为这是毫无意义的,答案是否有任何错误? (29认同)
  • @ LasseV.Karlsen在右边有"INNER JOIN"并且在等价列表的左边只有"JOIN"会更好吗? (10认同)
  • @ LasseV.Karlsen我只是说左侧是简洁的形式,右侧是扩展形式.我认为如果你对"JOIN"也采取同样的措施,它会使它变得连贯. (7认同)
  • @Outlier说实话,如果你不想读我的"长"答案,那么我的回答不适合你.这是为了其他所有人来到这里想知道同样的事情,并想要了解为什么会这样,以及在哪里可以找到更多信息,等等.很明显,你是那种想要这个答案的人:"没有",但遗憾的是Stack Overflow上不是一个合法的答案,也不是. (5认同)
  • Lovin'用于解释差异的图表. (3认同)
  • 只需像@sactiw 一样提到“关键字 OUTER 被标记为可选”。为什么这么长的答案?浪费时间..如果答案是有针对性的更好..而不是毫无意义。抱歉太苛刻了.. (2认同)
  • 精湛的解释,特别是图表让我们记住了清晰的画面。+1 解释得如此清楚。谢谢 (2认同)
  • 这里的维恩例子是**崇高**。现在所有的连接对我来说都是完全合理的。谢谢一万遍!!! (2认同)

sac*_*tiw 689

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

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

  1. 交叉

  1. INNER JOIN - 如果两个表中都存在数据,则获取数据.

  2. OUTER JOIN3种类型:

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


需要注意的要点:

  • 如果你只是提到JOIN那么默认它是一个INNER JOIN.
  • 一个OUTER加入必须是LEFT| RIGHT| FULL你不能简单地说OUTER JOIN.
  • 您可以删除OUTER关键字,只需说LEFT JOINRIGHT JOINFULL JOIN.

对于那些想要以更好的方式可视化这些内容的人,请转到此链接: SQL连接的可视化解释

  • 非常好的答案.如果你说"LEFT OUTER JOIN - 从左表中获取所有数据,如果预设的话,从右边获取匹配的数据"将会更清楚.2.1(和2.2的类似变化) (14认同)
  • @RhysO不,CROSS JOIN是一个笛卡尔积,即一个表的CROSS JOIN,有n行,有一个表,有m行,总是给出(n*m)行,而表的FULL OUTER JOIN有n行,有一个表,有m行,将给出最多(n + m)行 (8认同)
  • 抱歉,如果我是死党,但是“ CROSS JOIN”和“ FULL JOIN”是否相同? (2认同)
  • @sactiw 考虑在您有价值的答案中添加关于“交叉连接”和“完全外部连接”之间差异的特别注释......在某种程度上似乎相似。 (2认同)

Mit*_*eat 342

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

没什么.LEFT JOIN并且LEFT OUTER JOIN是等价的.

  • 呃你好!谁投了这票?LEFT JOIN与LEFT OUTER JOIN相同. (11认同)
  • Microsoft SQL Server和任何其他符合SQL的RDBMS都是这种情况. (6认同)
  • 如果你添加一个关于为什么`OUTER`是可选的参考或解释会很好. (6认同)
  • 这里最简洁,准确的答案. (6认同)
  • 它是可选的,因为它是不必要的! (3认同)
  • 谢谢.接受的答案有太多的信息让我更加困惑.这正是我需要知道的并直接回答原始问题. (3认同)
  • @MitchWheat 如果没有必要,为什么会诞生? (2认同)
  • @KevinBui:我不知道,我不负责编写语言定义。但无论如何,这是不必要的。哦,谢谢你的反对票 (2认同)

小智 65

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

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

"的字样INNER,并OUTER在所有形式的可选的.INNER是默认; LEFT,RIGHT,和FULL暗示外连接."

换句话说,

LEFT JOIN并且LEFT OUTER JOIN是相同的

RIGHT JOIN并且RIGHT OUTER JOIN是相同的

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


Wor*_*ter 58

Left Join并且Left Outer Join同一个.前者是后者的简写.同样可以对说Right JoinRight Outer Join关系.示威将说明平等.每个查询的工作示例都是通过SQL Fiddle提供的.此工具将允许动手操作查询.

特定

在此输入图像描述

左连接左外连接

在此输入图像描述

结果

在此输入图像描述


正确的加入正确的外部加入

在此输入图像描述

结果

在此输入图像描述


fro*_*jim 42

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

  • CROSS JOIN - 两张桌子的笛卡尔积.ALL连接从这里开始
  • INNER JOIN - 添加了过滤器的CROSS JOIN.
  • OUTER JOIN - 随后添加缺少元素(来自LEFT或RIGHT表)的INNER JOIN.

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

希望这有助于解决问题.

  • 这并不能回答问题。 (4认同)

Yug*_*ryl 29

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

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)
Run Code Online (Sandbox Code Playgroud)

现在很清楚为什么这些操作具有别名,并且很明显只存在3种情况:INNER,OUTER,CROSS.有两个子案例用于OUTER.词汇,教师解释这一点的方式,以及上面的一些答案,往往使它看起来有很多不同类型的连接.但它实际上非常简单.

  • “很明显只存在 3 个案例”:有趣但有缺陷。考虑到内部联接是一种专门的交叉联接(即,将联接谓词移至 where 子句)。进一步考虑外连接根本不是连接,而是一个联合,其中使用空值代替“丢失”列。因此,可以说交叉是唯一需要的连接。请注意,关系理论中当前的想法是自然连接满足所有连接要求。旁白:你能解释一下词汇“‘JOIN’意味着‘INNER JOIN’”是否/如何符合你对外连接词汇的推理? (2认同)

小智 25

回答你的问题

在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
Run Code Online (Sandbox Code Playgroud)

其他等效语法

INNER JOIN => JOIN
CROSS JOIN => ,
Run Code Online (Sandbox Code Playgroud)

强烈推荐Dotnet Mob Artice:加入Sql Server 在此输入图像描述

  • 在这里重新滥用维恩图,请参阅我对这个问题的评论。 (3认同)

小智 19

只有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    
    
    Run Code Online (Sandbox Code Playgroud)

希望它有所帮助.

  • 所以总共有5个加入。 (2认同)

小智 18

JOIN主要有三种类型

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

    • LEFT OUTER - - 仅提取左表和匹配条件中的数据
    • RIGHT OUTER - - 仅在右表和匹配条件中提取数据
    • FULL OUTER - - 获取任何或两个表中的数据
    • (左或右或全)外部联接可以写成"外部"
  3. 交叉加入:将一切都融入到一切


Uns*_*ced 15

句法糖使随意读者更明显地认为联合不是内在的.

  • tableA FULL OUTER JOIN tableB将为您提供三种类型的记录:tableA中的所有记录在tableB中没有匹配的记录,tableB中的所有记录在tableA中没有匹配的记录,tableA中的所有记录在tableB中具有匹配的记录. (4认同)
  • 那么......什么是完全外部联接呢? (2认同)

小智 8

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

加入

  1. 内连接 = 连接

  2. 外连接

    • 左外连接 = 左连接

    • 右外连接 = 右连接

    • 完全外连接 = 完全连接

  3. 交叉连接

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

申请

  1. CROSS APPLY -- 类似于 INNER JOIN (但增加了能够为左表的每一行计算右表中的某些内容并且只返回匹配行的优势)
  2. OUTER APPLY -- 类似于 LEFT OUTER JOIN (但增加了能够为左表的每一行计算右表中的某些内容的优势,并且无论右表是否匹配都会返回左表中的所有行)

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

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

现实生活中的例子,什么时候在 SQL 中使用 OUTER / CROSS APPLY

我发现 APPLY 运算符非常有益,因为它们比必须在子查询中执行相同的计算提供更好的性能。它们还替代了旧版 SQL Server 中的许多分析函数。这就是为什么我相信在熟悉了 JOINS 之后,SQL 开发人员接下来应该尝试学习 APPLY 运算符。