SQL服务器中的LEFT JOIN与LEFT OUTER JOIN

LEFT JOINLEFT OUTER JOIN有什么区别?

1964378 次浏览

左连接和左向外连接有什么区别?

LEFT JOINLEFT OUTER JOIN是等价的。

留档:从(事务-SQL)

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

关键字OUTER被标记为可选(用方括号括起来)。在这种情况下,您是否指定OUTER没有任何区别。请注意,虽然连接子句的其他元素也被标记为可选,但留下他们而不是会有所不同。

例如,JOIN子句的整个type-part是可选的,在这种情况下,如果您只指定JOIN,则默认为INNER。换句话说,这是合法的:

SELECT *FROM A JOIN B ON A.X = B.Y

以下是等效语法的列表:

A LEFT JOIN B            A LEFT OUTER JOIN BA RIGHT JOIN B           A RIGHT OUTER JOIN BA FULL JOIN B            A FULL OUTER JOIN BA INNER JOIN B           A JOIN B

也看看我在另一个SO问题上留下的答案:SQL左连接vs多个表上从行?

语法糖,使它更明显的休闲读者,连接不是一个内在的。

我是PostgreSQL DBA,就我所能理解的外连接与非外连接之间的区别是一个在互联网上有相当多讨论的话题。直到今天,我从未看到这两者之间的区别;所以我更进一步,试图找到它们之间的区别。最后我读了整个留档,我找到了答案,

因此,如果你查看留档(至少在PostgreSQL中),你可以找到这个短语:

"单词#0和#1在所有形式中都是可选的。#0是默认值;#3、#4和#5暗示外部连接。"

换句话说,

LEFT JOINLEFT OUTER JOIN是一样的

RIGHT JOINRIGHT OUTER JOIN是一样的

我希望这对那些仍在努力寻找答案的人有所帮助。

要回答你的问题,左加入之间没有区别和LEFT OUTER JOIN,他们是完全相同的说…

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

  1. INNER
  2. 外部
  3. CROSS

  1. INNER JOIN-如果两个表中都存在,则获取数据。

  2. 外部连接3类型:

    1. LEFT OUTER JOIN-如果存在于左表中,则获取数据。
    2. RIGHT OUTER JOIN-如果数据存在于右表中,则获取数据。
    3. FULL OUTER JOIN-如果存在于两个表中的任何一个中,则获取数据。
  3. 交叉连接,顾名思义,[n X m]将一切连接到一切。
    类似于我们简单地列出要连接的表的场景(在SELECT语句的FROM子句中),使用逗号分隔它们。


注意事项:

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

对于那些想以更好的方式可视化这些的人,请访问此链接:SQL连接的可视化解释

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

  • CROSS JOIN-两个表的笛卡尔乘积
  • INNER JOIN-添加了过滤器的交叉连接。
  • OUTER JOIN-缺少元素的INNER JOIN(来自左表或右表)之后添加。

在我想出这个(相对)简单的模型之前,JOINS一直是一种黑色艺术。现在它们完全有意义了。

希望这能帮助更多比它混淆。

主要有三种类型的JOIN

  1. 内部:获取数据,存在于两个表中
    • 唯一的加入意味着内在的加入
  2. 外部:有三种类型

    • LEFT OUTER--获取仅在左表和匹配条件中存在的数据
    • 右OUTER--获取仅在右表和匹配条件中存在的数据
    • FULL OUTER--获取存在任何表或两个表的数据
    • (左或右或全)OUTER JOIN可以写w/o写“OUTER”
  3. 交叉连接:将一切连接到一切

为什么左/右和左/右是一样的?让我们解释一下为什么这个词汇。了解LEFT和Right连接是OUTER连接的特定情况,因此只能是OUTER LEFT/OUTER Right。OUTER连接也称为完整 OUTER,而不是OUTER连接的部分结果的左连接和右连接。确实:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B1    |   5            1    |   1             1    |   1             1    |   12    |   1            2    |   2             2    |   2             2    |   23    |   6            3    |  null           3    |  null           -    |   -4    |   2            4    |  null           4    |  null           -    |   -null  |   5             -    |   -            null  |   5null  |   6             -    |   -            null  |   6
OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

现在很清楚为什么这些操作有别名,也很清楚只存在3种情况:INNER、OUTER、CROSS。OUTER有两个子情况。词汇,老师解释这个的方式,以及上面的一些答案,通常看起来有很多不同类型的连接。但实际上非常简单。

Left JoinLeft Outer Join是一个和相同。前者是后者的简写。Right JoinRight Outer Join的关系也是如此。演示将说明相等性。通过SQL小提琴提供了每个查询的工作示例。该工具将允许动手操作查询。

鉴于

输入图片描述

左连接左外连接

输入图片描述

搜索结果

输入图片描述


右连接右外连接

输入图片描述

搜索结果

输入图片描述

来回答你的问题

在SQL Server中,连接语法外部是可选的

在msdn文章中提到:https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130). aspx

因此,以下列表显示了使用和不使用外部的连接等效语法

LEFT OUTER JOIN => LEFT JOINRIGHT OUTER JOIN => RIGHT JOINFULL OUTER JOIN => FULL JOIN

其他等效语法

INNER JOIN => JOINCROSS JOIN => ,

强烈推荐Dotnet Mob Artis:加入Sql服务器输入图片描述

只有3个连接:

  • A)交叉连接=笛卡尔(例如:表A,表B)

  • B)内连接=连接(例如:表A连接/内连接表B)

  • C)外连接:

    有三种类型的外连接

    1. 左外接=左接
    2. 右外连接=右连接
    3. 全外连接=全连接

在这个问题的背景下,我也想发布两个“应用”运算符:

加入

  1. 内部连接=连接

  2. 外部连接

    • 左外接=左接

    • 右外连接=右连接

    • 完全外部连接=完全连接

  3. 交叉连接

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

申请

  1. 交叉申请-类似于INNER JOIN(但增加了能够为左表的每一行计算右表中的某些内容的优势,并且仅返回匹配的行)
  2. 外部申请-类似于LEFT OUTER JOIN(但增加了能够为左表的每一行计算右表中的某些内容的优势,并且将返回左表中的所有行,而不管右表上的匹配)

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运算符非常有用,因为它们比在子查询中执行相同的计算提供更好的性能。它们还替换了旧版本SQLServer中的许多分析函数。这就是为什么我相信在熟悉JOINS之后,SQL开发人员应该尝试下一步学习APPLY运算符。