ChatGPT解决这个技术问题 Extra ChatGPT

SQL Server 中的 LEFT JOIN 与 LEFT OUTER JOIN

LEFT JOINLEFT OUTER JOIN 有什么区别?


p
philipxy

根据文档:FROM (Transact-SQL)

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

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

例如,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 left join vs multiple tables on FROM line?


完全正确。允许使用 OUTER 以实现 ANSI-92 兼容性。
@LasseV.Karlsen 在等价物列表中将 INNER JOIN 放在右侧,而将 JOIN 放在左侧不是更好吗?
@LasseV.Karlsen 我只是说左侧具有简洁形式,右侧具有扩展形式。我认为如果您对 JOIN 也遵循相同的规则,它就会变得连贯。
根据标准 SQL OUTER 也是一个可选关键字:; ::= 内部 | <外连接类型> [外]
S
SriniV

要回答您的问题,LEFT JOIN 和 LEFT OUTER JOIN 之间没有区别,它们与所说的完全相同......

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

内外十字

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

需要注意的点:

如果您只提到 JOIN,那么默认情况下它是一个 INNER JOIN。

OUTER join 必须是 LEFT |右 | FULL 你不能简单地说 OUTER JOIN。

您可以删除 OUTER 关键字,只说 LEFT JOIN 或 RIGHT JOIN 或 FULL JOIN。

对于那些想要以更好的方式可视化这些内容的人,请访问此链接:A Visual Explanation of SQL Joins


很好的答案。如果您说“LEFT OUTER JOIN - 如果预设,则从左表中获取所有数据以及来自右表的匹配数据”会更清楚。对于 2.1(以及 2.2 的类似更改)
您也可以通过简单地“从 TableA、TableB 中选择 *”来进行交叉连接
对不起,如果我是 necrobumping,但是 CROSS JOINFULL JOIN 一样吗?
@RhysO 不,CROSS JOIN 是笛卡尔积,即具有 n 行的表的 CROSS JOIN,具有 m 行的表,将始终给出 (n*m) 行,而具有 n 行的表的 FULL OUTER JOIN,有一个表,有 m 行,将给出最大 (n+m) 行
@sactiw 考虑在您的宝贵答案中添加一个关于 Cross JoinFull Outer Join 之间区别的特别说明......在某种程度上似乎相似。
M
Mitch Wheat

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

没有LEFT JOINLEFT OUTER JOIN 是等价的。


在 Microsoft SQL Server 和任何其他符合 SQL 的 RDBMS 中就是这种情况。
x
xdhmoore

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

给定

https://i.stack.imgur.com/Ckxby.png

Left JoinLeft Outer Join

https://i.stack.imgur.com/O2MLK.jpg

结果

https://i.stack.imgur.com/q5oyL.png

Right JoinRight Outer Join

https://i.stack.imgur.com/o9YXl.jpg

结果

https://i.stack.imgur.com/dbxLT.png


s
shA.t

我是一名 PostgreSQL DBA,据我所知,外部联接与非外部联接之间的区别是一个在互联网上引起大量讨论的话题。直到今天,我从未看到这两者之间的区别。所以我走得更远,我试图找到它们之间的区别。最后,我阅读了有关它的整个文档,并找到了答案,

因此,如果您查看文档(至少在 PostgreSQL 中),您可以找到以下短语:

"The words INNER and OUTER are optional in all forms. INNER is the default; LEFT, RIGHT, and FULL imply an outer join."

换句话说,

LEFT JOINLEFT OUTER JOIN 相同

RIGHT JOINRIGHT OUTER JOIN 相同

我希望它可以为那些仍在努力寻找答案的人做出贡献。


f
frozenjim

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

CROSS JOIN - 两个表的笛卡尔积。所有连接都从这里开始

INNER JOIN - 添加了过滤器的 CROSS JOIN。

OUTER JOIN - 之后添加缺少元素(来自 LEFT 或 RIGHT 表)的 INNER JOIN。

在我想出这个(相对)简单的模型之前,JOINS 总是更像是一种黑色艺术。现在他们很有意义。

希望这有助于而不是令人困惑。


这没有回答问题。
Y
Yugo Amaryl

为什么 LEFT/RIGHT 和 LEFT OUTER/RIGHT OUTER 是一样的?让我们解释为什么这个词汇。了解 LEFT 和 RIGHT 连接是 OUTER 连接的特定情况,因此只能是 OUTER LEFT/OUTER RIGHT。与作为 OUTER 连接的 PARTIAL 结果的 LEFT 和 RIGHT 连接相反,OUTER 连接也称为 FULL OUTER。的确:

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 的子箱。词汇,老师解释这个的方式,以及上面的一些答案,通常看起来有很多不同类型的连接。但实际上非常简单。


“很明显只有 3 个案例存在”:有趣但有缺陷。考虑一个内部连接是一个专门的交叉连接(即将连接谓词移动到 where 子句)。进一步考虑外部联接根本不是联接,而是使用空值代替“缺失”列的联合。因此,可以说 cross 是唯一需要的连接。请注意,关系理论中当前的想法是自然连接满足所有连接要求。另外:您能否解释一下词汇“JOIN 暗示 INNER JOIN”是否/如何符合您对外部连接词汇的推理?
M
MD. Khairul Basar

回答你的问题

在 Sql Server 中连接语法 OUTER 是可选的

在 msdn 文章中提到: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 => ,

https://i.stack.imgur.com/S3WMq.jpg


T
TylerH

只有3个连接:

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

B) Inner Join = JOIN (例如: Table A Join/Inner Join Table B)

C) 外连接:外连接有三种类型 左外连接 = 左连接 右外连接 = 右连接 完全外连接 = 完全连接

左外连接 = 左连接

右外连接 = 右连接

全外连接 = 全连接


所以总共有5个加入。
s
sjngm

JOIN主要有3种类型

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


U
Uncle Iroh

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


那么...什么是完全外部连接呢?
tableA FULL OUTER JOIN tableB 将为您提供三种类型的记录:tableA 中的所有记录,tableB 中没有匹配的记录,tableB 中的所有记录,tableA 中没有匹配的记录,tableA 中的所有记录,tableB 中的匹配记录。
s
san

就在这个问题的上下文中,我还想发布 2 个“应用”运算符:

加入:

内连接 = 外连接 左外连接 = 左连接 右外连接 = 右连接 完全外连接 = 完全连接 交叉连接

SELF-JOIN:这不完全是一种单独的连接类型。这基本上是使用上述连接之一将表连接到自身。但我觉得在上下文 JOIN 讨论中值得一提,因为您会从 SQL Developer 社区的许多人那里听到这个术语。

申请:

CROSS APPLY -- 类似于 INNER JOIN (但增加了能够在 Right 表中为 Left 表的每一行计算某些内容并且只返回匹配行) 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/

Real life example, when to use OUTER / CROSS APPLY in SQL

我发现 APPLY 运算符非常有用,因为它们比在子查询中进行相同的计算提供更好的性能。它们还替代了旧版本 SQL Server 中的许多分析函数。这就是为什么我相信在熟悉 JOINS 之后,SQL 开发人员接下来应该尝试学习 APPLY 运算符。