SQL Server 中的左联接与左外联接

LEFT JOIN vs. LEFT OUTER JOIN in SQL Server

提问人:KG Sosa 提问时间:1/2/2009 最后编辑:QuiverKG Sosa 更新时间:9/6/2023 访问量:2089308

问:

和 和有什么不一样?LEFT JOINLEFT OUTER JOIN

sql-server t-sql 左联接 outer-join

评论


答:

449赞 Mitch Wheat 1/2/2009 #1

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

什么都没有。 并且是等价的。LEFT JOINLEFT OUTER JOIN

评论

14赞 Bill Karwin 1/2/2009
Microsoft SQL Server 和任何其他符合 SQL 的 RDBMS 就是这种情况。
2736赞 Lasse V. Karlsen 1/2/2009 #2

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

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

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

例如,子句的整个 type-part 是可选的,在这种情况下,默认值是 if you just 指定 .换句话说,这是合法的:JOININNERJOIN

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 left join vs FROM 行上的多个表?

评论

166赞 Sean Reilly 1/3/2009
绝对正确。允许 OUTER 实现 ANSI-92 兼容性。
24赞 nawfal 5/1/2013
@LasseV.Karlsen,在等价物列表中,在右边和左边不是更好吗?INNER JOINJOIN
12赞 nawfal 5/2/2013
@LasseV.Karlsen:我只是说左边有简洁的形式,右边有扩展的形式。我认为如果你也遵循相同的 s,它会使它连贯。JOIN
1赞 dnoeth 10/12/2015
根据标准SQL也是一个可选的关键字: <连接类型> ::= INNER | <外部连接类型> [ OUTER ]OUTER
20赞 Unsliced 1/2/2009 #3

句法糖,使普通读者更清楚地知道连接不是内部连接。

评论

2赞 Amy B 1/3/2009
所以。。。那么什么是完全外部连接呢?
6赞 Dave DuPlantis 10/6/2009
tableA FULL OUTER JOIN tableB 将为您提供三种类型的记录:tableA 中所有记录,tableB 中没有匹配记录,tableB 中所有记录,tableA 中没有匹配记录,tableA 中所有记录,tableB 中所有记录,tableB 中都有匹配记录。
82赞 andrefsp 8/30/2010 #4

我是一名 PostgreSQL DBA。外部连接与非外部连接之间的区别是一个在互联网上有大量讨论的话题。

如果您查看 PostgreSQL 文档:

单词 和 在所有形式中都是可选的。 是默认值;、 和 表示外部连接。(http://www.postgresql.org/docs/8.4/static/queries-table-expressions.htmlINNEROUTERINNERLEFTRIGHTFULL)

换言之,

左连接和左外连接相同

右连接和右外连接是相同的

878赞 sactiw 12/10/2010 #5

和之间没有区别,它们完全相同。LEFT JOINLEFT OUTER JOIN

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

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

  2. OUTER JOIN3 种类型:

    1. LEFT OUTER JOIN- 如果左表中存在数据,则获取数据。
    2. RIGHT OUTER JOIN- 如果数据存在于正确的表中,则获取数据。
    3. FULL OUTER JOIN- 如果数据存在于两个表中的任何一个中,则获取数据。
  3. CROSS JOIN,顾名思义,做 n 次 m 配对,将一切连接起来。 这类似于我们简单地列出要连接的表(在语句的子句中),使用逗号分隔它们。FROMSELECT

注意事项:

  • 如果你只是提到,那么默认情况下它是一个.JOININNER JOIN
  • 联接必须是 | | ;你不能简单地说.OUTERLEFTRIGHTFULLOUTER JOIN
  • 您可以删除关键字,然后只说 or 或 。OUTERLEFT JOINRIGHT JOINFULL JOIN

SQL 联接的可视化说明

评论

23赞 ssh 12/28/2012
很好的答案。如果对 2.1 说“LEFT OUTER JOIN - 从左侧表中获取所有数据,并从右侧获取匹配数据,如果预设”,则会更清楚(以及 2.2 的类似更改)
17赞 sactiw 7/13/2016
@RhysO不,CROSS JOIN 是笛卡尔积,即表的 CROSS JOIN,有 n 行,有 m 行,将始终给出 (n*m) 行,而表的 FULL OUTER JOIN,有 n 行,表有 m 行,将给出最大 (n+m) 行
2赞 Manuel Jordan 10/12/2019
@sactiw考虑在您的宝贵答案中添加一个关于和之间的区别的特别说明......在某种程度上似乎是相似的。Cross JoinFull Outer Join
1赞 philipxy 2/3/2023
@ManuelJordan 它们只是“看起来很相似”,因为这里的描述是如此模糊和糟糕。但是,如果您采用此处的描述并尝试使用它们来计算运算符调用的示例结果,这应该很清楚......你不能,太模糊和可怜了。无论如何,第一句话之后的所有内容都与问题帖子无关。此外,最后链接中的博客也是一团糟,作者承认博客很混乱,对他们自己在博客上的评论没有用。维恩图对于描述连接没有用处。
59赞 frozenjim 12/30/2011 #6

我发现按以下顺序考虑 Joins 更容易:

  • CROSS JOIN - 两个表的笛卡尔乘积。所有联接都从这里开始
  • INNER JOIN - 添加了过滤器的 CROSS JOIN。
  • OUTER JOIN - 缺少元素的 INNER JOIN(来自 LEFT 或 RIGHT 表) 之后添加。

在我弄清楚这个(相对)简单的模型之前,JOINS总是更像是一门黑色艺术。现在它们非常有意义。

评论

4赞 philipxy 6/17/2019
这并不能回答这个问题。
23赞 Harsh 1/18/2012 #7

JOIN主要有三种类型

  1. Inner:获取两个表中都存在的数据
    • 只有 JOIN 表示 INNER JOIN
  2. 外层:有三种类型

    • LEFT OUTER - - 获取仅存在于左表和匹配条件中的数据
    • RIGHT OUTER - - 获取仅存在于正确表和匹配条件中的数据
    • FULL OUTER - - 获取存在任何或两个表的数据
    • (左或右或全)OUTER JOIN可以写成不写“OUTER”
  3. 交叉连接:将所有内容连接到所有内容

42赞 Yugo Amaryl 4/18/2014 #8

为什么 LEFT/RIGHT 和 LEFT OUTER/RIGHT OUTER 相同?让我们解释一下为什么会有这个词汇。 了解 LEFT 和 RIGHT 连接是 OUTER 连接的特定情况,因此只能是 OUTER LEFT/OUTER RIGHT 之外的任何东西。OUTER 连接也称为 FULL OUTER,与作为 OUTER 连接的 PARTIAL 结果的 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。OUTER 有两个子案例。 词汇,老师解释这一点的方式,以及上面的一些答案,往往使它看起来有很多不同类型的连接。但其实很简单。

评论

2赞 onedaywhen 7/6/2016
“很明显只有 3 个案例存在”:有趣但有缺陷。考虑内部连接是专用的交叉连接(即将连接谓词移动到 where 子句)。进一步考虑一下,外部连接根本不是连接,而是一个联合,其中使用 null 值代替“缺失”列。因此,可以说交叉是唯一需要的连接。请注意,关系理论中当前的想法是自然连接满足所有连接要求。题外话:您能解释一下词汇“暗示”是否/如何符合您对外部连接词汇的推理吗?JOININNER JOIN
94赞 WorkSmarter 5/23/2015 #9

Left Join并且是一回事。前者是后者的简写。和关系也是如此。该演示将说明平等。每个查询的工作示例已通过 SQL Fiddle 提供。此工具将允许动手操作查询。Left Outer JoinRight JoinRight Outer Join

鉴于

在此处输入图像描述

左连接和左外连接

在此处输入图像描述

结果

在此处输入图像描述


右连接和右外连接

在此处输入图像描述

结果

在此处输入图像描述

51赞 mass 6/25/2016 #10

在 SQL Server 中,联接语法是可选的。OUTER

https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

带和不带的等效连接语法:OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

其他等效语法:

INNER JOIN => JOIN
CROSS JOIN => ,

Dotnet Mob 文章中的插图(强烈推荐) Joins in Sql Server

在此处输入图像描述

32赞 Delickate 3/17/2017 #11

只有 3 个联接:

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

  • 内部联接 = JOIN(例如:表 A 联接/内部联接表 B)

  • 外部连接

    有三种类型:

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

评论

12赞 Zeek2 7/20/2018
所以总共有 5 个加入。
18赞 san 6/17/2019 #12

加入:

  1. INNER JOIN = JOIN

  2. OUTER JOIN

    • LEFT OUTER JOIN = LEFT JOIN
    • RIGHT OUTER JOIN = RIGHT JOIN
    • FULL OUTER JOIN = FULL JOIN
  3. CROSS JOIN

Self-:这不完全是一种单独的联接类型。这是使用上述联接之一将表联接到自身。您将从 SQL 开发人员社区中的许多人那里听到这个术语。JOIN

有两个 APPLY 运算符:

  1. CROSS APPLY:类似于 (但有一个额外的优点,即能够为左边表的每一行计算右边表中的某些内容,并只返回匹配的行。INNER JOIN
  2. OUTER APPLY:类似于 (但有一个额外的优点,即能够为左表的每一行计算右表中的某些内容,并返回左表中的所有行,而不管右表上的匹配项如何。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 运算符非常有用,因为它们比在子查询中执行相同的计算提供更好的性能。它们也是旧版 SQL Server 中许多分析函数的替代品。因此,在熟悉 JOINS 之后,SQL 开发人员应该学习 APPLY 运算符。

-1赞 Arqish Mithani 6/24/2023 #13

在 SQL 中,术语“LEFT JOIN”和“LEFT OUTER JOIN”通常可以互换使用。这两种联接类型都返回左侧表(在 JOIN 关键字之前指定的表)中的所有行,以及从右侧表(在 JOIN 关键字之后指定的表)中返回匹配的行。但是,它们处理不匹配行的方式略有不同。

左连接或左外连接包括左表中的所有行,而不管右表中是否存在匹配项。如果没有匹配项,则结果将在右表的列中包含 NULL 值。

下面是一个示例来说明差异:

假设我们有两个表,Customers 和 Orders,它们有一个通用的列 CustomerID:

客户表:

CustomerID | CustomerName
-----------|--------------
1          | John
2          | Mary
3          | David

订单表:

OrderID | CustomerID | OrderDate
--------|------------|-----------
101     | 1          | 2023-01-01
102     | 2          | 2023-02-01

在这些表之间使用 LEFT JOIN 或 LEFT OUTER JOIN,结果为:

SELECT *
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

结果:

CustomerID | CustomerName | OrderID | CustomerID | OrderDate
-----------|--------------|---------|------------|-----------
1          | John         | 101     | 1          | 2023-01-01
2          | Mary         | 102     | 2          | 2023-02-01
3          | David        | NULL    | NULL       | NULL

如您所见,LEFT JOIN 返回左侧表 (Customers) 中的所有行,包括右侧表 (Orders) 中的列中值为 NULL 的不匹配行 (David)。

使用 dbForge Query Builder for SQL Server,您可以轻松选择所需的联接类型(包括 LEFT JOIN 或 LEFT OUTER JOIN),并直观地构建查询,而无需手动编写 SQL 代码。

评论

1赞 NotTheDr01ds 6/24/2023
欢迎来到 Stack Overflow!你的两个答案似乎都可能是由人工智能(例如 ChatGPT)编写的(全部或部分)。请注意,不允许在 Stack Overflow 上发布 AI 生成的内容。如果您使用 AI 工具来帮助回答这个问题,我能否请您 (1) 在此处回复评论,确认它是 AI 生成的,以及什么工具(例如,ChatGPT、Bing Chat、Copilot 等)——我们正在汇编有关 AI 辅助答案的数据,并可以使用您的帮助。(2)评论后,我建议删除你的答案。谢谢!
1赞 NotTheDr01ds 6/24/2023
读者应该仔细和批判性地审查这个答案,因为人工智能生成的信息通常包含根本性的错误和错误信息。如果您发现质量问题和/或有理由相信此答案是由 AI 生成的,请留下相应的反馈。审核团队可以使用您的帮助来识别质量问题。