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


当前回答

JOIN主要有三种类型

内部:获取两个表中存在的数据仅JOIN表示INNER JOIN外部:有三种类型LEFT OUTER--仅获取左表匹配条件中的数据RIGHT OUTER--仅获取右表匹配条件下的数据FULL OUTER—获取任何或两个表中的数据(LEFT或RIGHT或FULL)OUTER JOIN可以不写“OUTER”交叉连接:将所有内容连接到所有内容

其他回答

只有3个连接:

A) 交叉连接=笛卡尔(例如:表A、表B)B) 内部联接=联接(例如:表A联接/内部联接表B)C) 外部连接:有三种类型的外部连接左外部联接=左联接右外部联接=右联接完全外部联接=完全联接

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

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

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

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

在我找到这个(相对)简单的模型之前,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运算符。