LEFT JOIN
和 和有什么不一样LEFT OUTER JOIN
?
12 回答
根据文档:FROM (Transact-SQL):
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
关键字OUTER
被标记为可选(括在方括号中)。在这种特定情况下,您是否指定OUTER
没有区别。请注意,虽然 join 子句的其他元素也被标记为可选,但将它们排除在外会有所不同。
例如,JOIN
子句的整个类型部分是可选的,在这种情况下,INNER
如果您只指定JOIN
. 换句话说,这是合法的:
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?.
要回答您的问题,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]
就是把所有东西都连接起来。
类似于我们简单地列出要加入的表(在语句的FROM
子句中SELECT
)的场景,使用逗号分隔它们。
需要注意的点:
- 如果您只是提到
JOIN
,那么默认情况下它是一个INNER JOIN
. - 连接
OUTER
必须是LEFT
|RIGHT
|FULL
你不能简单地说OUTER JOIN
。 - 您可以删除
OUTER
关键字,然后说LEFT JOIN
orRIGHT JOIN
或FULL JOIN
。
对于那些想要以更好的方式可视化这些的人,请转到此链接: SQL 连接的可视化解释
左连接和左外连接有什么区别?
没什么。LEFT JOIN
并且LEFT OUTER JOIN
是等价的。
我是一名 PostgreSQL DBA,据我所知,外部联接与非外部联接之间的区别是一个在互联网上引起大量讨论的话题。直到今天,我从未看到这两者之间的区别。所以我走得更远,我试图找到它们之间的区别。最后,我阅读了有关它的整个文档,并找到了答案,
因此,如果您查看文档(至少在 PostgreSQL 中),您可以找到以下短语:
“单词INNER
和OUTER
在所有形式中都是可选的。INNER
是默认值;LEFT
,RIGHT
和FULL
暗示外连接。”
换句话说,
LEFT JOIN
并且LEFT OUTER JOIN
是相同的
RIGHT JOIN
并且RIGHT OUTER JOIN
是相同的
我希望它可以为那些仍在努力寻找答案的人做出贡献。
我发现按以下顺序更容易考虑加入:
- CROSS JOIN - 两个表的笛卡尔积。所有连接都从这里开始
- INNER JOIN - 添加了过滤器的 CROSS JOIN。
- OUTER JOIN - 之后添加缺少元素(来自 LEFT 或 RIGHT 表)的 INNER JOIN。
在我想出这个(相对)简单的模型之前,JOINS 总是更像是一种黑色艺术。现在他们很有意义。
希望这有助于而不是令人困惑。
为什么 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 的子箱。词汇,老师解释这个的方式,以及上面的一些答案,通常看起来有很多不同类型的连接。但实际上非常简单。
回答你的问题
在 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 => ,
强烈推荐Dotnet Mob Artice:加入Sql Server
只有3个连接:
- A)交叉连接=笛卡尔(例如:表A,表B)
- B) Inner Join = JOIN (例如: Table A Join/Inner Join Table B)
C) 外连接:
There are three type of outer join 1) Left Outer Join = Left Join 2) Right Outer Join = Right Join 3) Full Outer Join = Full Join
希望它会有所帮助。
JOIN主要有3种类型
- 内部:获取两个表中都存在的数据
- 只有 JOIN 表示 INNER JOIN
外:分为三种
- LEFT OUTER - - 获取仅存在于左表和匹配条件中的数据
- RIGHT OUTER - - 获取仅存在于右表和匹配条件中的数据
- FULL OUTER - - 获取任何或两个表中的数据
- (LEFT or RIGHT or FULL) OUTER JOIN 可以写成不写“OUTER”
交叉连接:连接一切
语法糖,让普通读者更清楚地知道连接不是内部连接。
就在这个问题的上下文中,我还想发布 2 个“应用”运算符:
加入:
内连接 = 连接
外连接
左外连接 = 左连接
右外连接 = 右连接
完全外连接 = 完全连接
交叉连接
SELF-JOIN:这不完全是一种单独的连接类型。这基本上是使用上述连接之一将表连接到自身。但我觉得在上下文 JOIN 讨论中值得一提,因为您会从 SQL Developer 社区的许多人那里听到这个术语。
申请:
- CROSS APPLY -- 类似于 INNER JOIN (但增加了能够为左表的每一行计算右表中的某些内容并且只返回匹配行的优势)
- 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 运算符。