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


当前回答

要回答您的问题,LEFT JOIN之间没有区别和LEFT OUTER JOIN,它们和上面说的完全一样。。。

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

内部外部十字


INNER JOIN-如果两个表中都存在,则获取数据。OUTER JOIN有三种类型:LEFT OUTER JOIN-获取左表中存在的数据。RIGHT OUTER JOIN-如果右表中存在,则获取数据。FULL OUTER JOIN-如果两个表中的任何一个表中存在,则获取数据。顾名思义,CROSS JOIN是将所有事物连接到所有事物的[n X m]。类似于我们简单列出要连接的表(在SELECT语句的FROM子句中)的场景,使用逗号分隔它们。


注意事项:

如果您只提到JOIN,那么默认情况下它是INNER JOIN。OUTER联接必须是LEFT|RIGHT|FULL,不能简单地说OUTER联接。您可以删除OUTER关键字,只需说LEFT JOIN或RIGHT JOIN或FULL JOIN。


对于那些希望以更好的方式可视化这些内容的人,请访问以下链接:SQL联接的可视化解释

其他回答

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

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

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

根据文档: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运算符。

要回答您的问题,LEFT JOIN之间没有区别和LEFT OUTER JOIN,它们和上面说的完全一样。。。

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

内部外部十字


INNER JOIN-如果两个表中都存在,则获取数据。OUTER JOIN有三种类型:LEFT OUTER JOIN-获取左表中存在的数据。RIGHT OUTER JOIN-如果右表中存在,则获取数据。FULL OUTER JOIN-如果两个表中的任何一个表中存在,则获取数据。顾名思义,CROSS JOIN是将所有事物连接到所有事物的[n X m]。类似于我们简单列出要连接的表(在SELECT语句的FROM子句中)的场景,使用逗号分隔它们。


注意事项:

如果您只提到JOIN,那么默认情况下它是INNER JOIN。OUTER联接必须是LEFT|RIGHT|FULL,不能简单地说OUTER联接。您可以删除OUTER关键字,只需说LEFT JOIN或RIGHT JOIN或FULL JOIN。


对于那些希望以更好的方式可视化这些内容的人,请访问以下链接:SQL联接的可视化解释