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


当前回答

就在这个问题的上下文中,我还想发布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运算符。

其他回答

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

为什么左/右和左外/右外相同?让我们解释一下为什么使用这个词汇。请理解,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。外部有两个子情况。词汇、老师解释这一点的方式,以及上面的一些答案,通常会让人觉得有很多不同类型的连接。但其实很简单。

就在这个问题的上下文中,我还想发布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运算符。

根据文档: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行上的多个表?。

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

CROSS JOIN-两个表的笛卡尔乘积。所有连接从此处开始INNER JOIN-添加了过滤器的CROSS JOIN。OUTER JOIN-缺少元素的INNER JOIN(来自LEFT或RIGHT表)随后添加。

在我找到这个(相对)简单的模型之前,JOIN总是有点像一门黑色艺术。现在它们很有意义。

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