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


当前回答

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

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

关键字OUTER标记为可选(括在方括号中)。在这种特定情况下,是否指定OUTER没有任何区别。请注意,虽然join子句的其他元素也被标记为可选的,但将它们排除在外会有所不同。

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

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行上的多个表?。

其他回答

左连接和左外部连接之间的区别是什么?

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

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

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

关键字OUTER标记为可选(括在方括号中)。在这种特定情况下,是否指定OUTER没有任何区别。请注意,虽然join子句的其他元素也被标记为可选的,但将它们排除在外会有所不同。

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

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行上的多个表?。

就在这个问题的上下文中,我还想发布2个“APPLY”运算符:

连接:

内部联接=联接外部连接左外部联接=左联接右外部联接=右联接完全外部连接=完全连接交叉连接

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

应用:

CROSS APPLY——类似于INNER JOIN(但增加了一个优点,即能够为Left表的每一行在Right表中计算一些值,并且只返回匹配的行)OUTER APPLY——类似于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中的许多分析函数。这就是为什么我相信在熟悉JOIN之后,一个SQL开发人员接下来应该尝试学习APPLY运算符。

左连接和左外部连接是相同的。前者是后者的简写。右联接和右外部联接关系也是如此。这次示威将说明平等。通过SQLFiddle提供了每个查询的工作示例。该工具将允许手动操作查询。

鉴于

左连接和左外部连接

后果


右连接和右外部连接

后果

语法糖,让不经意的读者更清楚地看到,连接不是内在的。