SQL Server中的左联接与左外部联接


1595

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


213
没有!该OUTER关键字是可选的。
jarlh

9
维恩图不适用于该问题的答案。这个问题的答案是“ 无”。请参阅第一个评论。
philipxy

3
维恩图说明在输出行的差特殊情况下内VS外部联接如果没有输入空值或重复的行(因此我们可以将一个表作为一组行值并使用正常的数学等式),则左,右圆圈将保留左/右join的输出表/集。但是,如果输入的是空值或重复的行,那么很难解释圆是什么集合以及这些集合与输入和输出表/袋的关系如何,以至于维恩图无济于事。请参阅我的评论以及其他维恩图滥用。
philipxy

Answers:


2236

根据文档:FROM(Transact-SQL)

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

该关键字OUTER被标记为可选(括在方括号中)。在这种特定情况下,是否指定OUTER都没有区别。请注意,尽管join子句的其他元素也被标记为可选元素,但将它们省略有所不同。

例如,JOIN子句的整个type-part 是可选的,在这种情况下,默认情况是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

还要看看我在另一个SO问题上留下的答案:SQL左联接与FROM行上的多个表?

在此处输入图片说明


135
完全正确。允许OUTER以实现ANSI-92兼容性。
肖恩·赖利

11
@ LasseV.Karlsen 在等效项列表INNER JOIN的右侧和JOIN左侧是否会更好?
2013年

8
@ LasseV.Karlsen我只是说左边有简洁的形式,右边有扩展的形式。我认为,如果您也对JOINs 遵循相同的规则,则会使其变得连贯。
2013年

30
@Outlier这是您的特权,但显然有451个其他人认为答案很好。老实说,如果一个答案说X,另一个答案说X并参考文档,以及将文档的相关部分复制到答案中,我的投票将投给第二个答案,这就是为什么我以这样的方式编写答案的原因我做。有人声称 X不好。如果可以证明 X,那更好(不要误会我的回答)。但是,考虑任何您想做的事情是您的特权。我质疑为什么您认为这毫无意义,但答案是否有误?
Lasse V. Karlsen 2014年

7
@Outlier老实说,如果您不想阅读我的“冗长”答案,那么我的答案不适合您。这是给其他所有来这里的人都想知道同样的事情,并想要了解为什么这样做的原因,以及在哪里可以找到更多信息等。显然,您是那种想要这个答案的人:“无”,但是不幸的是,在Stack Overflow上不是合法的答案,也不应该。
Lasse V. Karlsen 2014年

699

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

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

  1. 交叉

  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)并使用逗号分隔它们的情况类似。


注意事项:

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

对于那些想以更好的方式可视化它们的人,请转到此链接: SQL联接的可视化解释


17
很好的答案。如果您说“ LEFT OUTER JOIN-从左表中获取所有数据,并从右表中获取匹配的数据(如果已预设),则将更加清晰”。for 2.1(2.2的更改类似)
ssh

1
您也可以通过简单地“从TableA,TableB中选择*”来进行交叉
联接

3
对不起,如果我正在死里逃生,但CROSS JOIN与一样FULL JOIN吗?
TechnicalTophat

9
@RhysO不,CROSS JOIN是笛卡尔积,即具有n行的表与具有m行的表的CROSS JOIN总是给出(n * m)行,而具有n行的表的FULL OUTER JOIN则总是,一个具有m行的表,最多将给出(n + m)行
sactiw

1
@sactiw考虑在您Cross JoinFull Outer Join... 之间的区别的有价值的答案中添加一个特殊说明,在某种程度上似乎很相似。
曼努埃尔·乔丹

354

左联接和左外部联接之间有什么区别?

没事LEFT JOINLEFT OUTER JOIN等价。


13
嗯,你好!谁投了反对票?LEFT JOIN与LEFT OUTER JOIN相同。
米奇·

7
在Microsoft SQL Server和任何其他符合SQL的RDBMS中就是这种情况。
比尔·卡温

7
如果您添加了有关为什么OUTER可选的参考或解释,那将是很好的。
Zero3 '16

7
这里最简洁,准确的答案。
Manachi

4
谢谢。被接受的答案包含太多信息,这让我更加困惑。这正是我所需要知道的,并直接回答了最初的问题。
培根·布拉德

66

我是PostgreSQL DBA,据我所知,外部联接或非外部联接之间的区别是一个在互联网上引起广泛讨论的话题。直到今天,我还没有看到两者之间的区别。因此,我走得更远,尝试找出两者之间的区别。最后,我阅读了有关它的整个文档,并找到了答案,

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

“的字样INNER,并OUTER在所有形式的可选的。INNER是默认; LEFTRIGHT,和FULL暗示外连接。”

换句话说,

LEFT JOIN并且LEFT OUTER JOIN是相同的

RIGHT JOIN并且RIGHT OUTER JOIN是相同的

我希望这可以为仍在努力寻找答案的人们做出贡献。


60

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

给定

在此处输入图片说明

左联接左外部联接

在此处输入图片说明

结果

在此处输入图片说明


右连接右外部连接

在此处输入图片说明

结果

在此处输入图片说明


43

我发现按以下顺序考虑联接比较容易:

  • CROSS JOIN-两个表的笛卡尔乘积。所有联接都从这里开始
  • 内部联接-添加了过滤器的交叉联接。
  • 外部联接-一个内部联接,其后添加了缺少的元素(来自LEFT或RIGHT表)。

在我弄清楚这个(相对)简单的模型之前,JOINS总是有点像妖术。现在,它们变得非常有意义。

希望这能帮助您解决更多的困惑。


这不能回答问题。
philipxy

33

为什么左/右和左/右/外相同?让我们解释一下为什么这个词汇。了解LEFT和RIGHT联接是OUTER联接的特定情况,因此除了OUTER LEFT / OUTER RIGHT之外别无其他。OUTER 联接也称为FULL OUTER,而OUTER联接的部分结果是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的子案例。词汇,教师的解释方式以及上面的一些答案,通常会使看起来好像有很多不同类型的联接。但这实际上非常简单。


1
“很明显只有3个案例存在”:有趣但有缺陷。考虑内部联接是专门的交叉联接(即,将移动谓词移动到where子句)。进一步考虑外部联接根本不是联接,而是一个联合,其中使用空值代替“缺少”列。因此,可以认为交叉是唯一需要的连接。请注意,关系理论中的当前想法是自然联接满足所有联接要求。除了:您能否解释词汇“ JOIN隐含INNER JOIN” 是否/如何符合您对外部联接词汇的推理?
一天,2016年

27

回答你的问题

在Sql Server中加入语法OUTER是可选的

msdn文章中提到了它:https ://msdn.microsoft.com/zh-cn/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:加入Sql Server 在此处输入图片说明


2
重新滥用维恩图在这里看到我对这个问题的评论。
philipxy

20

只有3个联接:

  • A)交叉联接=笛卡尔(例如:表A,表B)
  • B)内部联接= JOIN(例如:表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    

希望对您有所帮助。


1
因此共有5个连接。
Zeek2 '18年

19

JOIN主要有三种类型

  1. 内部:获取两个表中都存在的数据
    • 只有JOIN意味着INNER JOIN
  2. 外部:三种

    • LEFT OUTER--提取仅存在于左表和匹配条件中的数据
    • 右表--提取仅在右表和匹配条件中存在的数据
    • FULL OUTER--提取存在于任何一个或两个表中的数据
    • (左或右或全)外连接可以写而无需写“外”
  3. 交叉连接:将所有内容连接到所有内容


16

语法糖使休闲读者更加明白联接不是内部联接。


2
那么...什么是FULL OUTER JOIN?
艾米B

5
tableA FULL OUTER JOIN tableB将为您提供三种类型的记录:tableA中的所有记录在tableB中没有匹配的记录,tableB中的所有记录在tableA中没有匹配的记录,tableA中的所有记录在tableB中都有匹配的记录。
戴夫·杜普兰蒂斯

4

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

加盟

  1. 内联接 =联接

  2. 外连接

    • 左外联接=左联接

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

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

  3. 交叉加入

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

申请

  1. 交叉应用 -与INNER JOIN相似(但具有能够为Left表的每一行计算Right表中的内容并且仅返回匹配行的优点)
  2. 适用外部 -与LEFT OUTER JOIN相似(但具有以下优点:能够为Left表的每一行计算Right表中的内容,并且无论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/

实际示例,何时在SQL中使用OUTER / CROSS APPLY

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.