SQL Server中的左连接与左连接外连接
LEFT JOIN
和LEFT OUTER JOIN
什么区别?
根据文档: FROM(Transact-SQL) :
<join_type> ::= [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ] JOIN
关键字OUTER
被标记为可选的(用方括号括起来),这意味着在这种情况下是否指定它是没有区别的。 请注意,虽然连接子句的其他元素也被标记为可选,但将它们排除在外当然会有所作为。
例如, JOIN
子句的整个types部分是可选的,在这种情况下,如果您只指定了JOIN
,则缺省值为INNER
。 换句话说,这是合法的:
SELECT * FROM A JOIN B ON AX = BY
以下是等效语法列表:
A LEFT JOIN BA LEFT OUTER JOIN B A RIGHT JOIN BA RIGHT OUTER JOIN B A FULL JOIN BA FULL OUTER JOIN B A INNER JOIN BA JOIN B
另外看看我留在这个其他SO问题的答案: SQL左连接与FROM行上的多个表? 。
为了回答你的问题,左连接和左外连接之间没有区别,它们与上述完全相同 。
在顶层,主要有三种types的连接:
- 内
- 外
- 交叉
-
INNER JOIN – 如果两个表中都存在数据,则获取数据。
-
外部连接有三种types:
-
LEFT OUTER JOIN
(LEFT OUTER JOIN
– 获取左表中的数据。 -
RIGHT OUTER JOIN
– 如果存在于右表中,则获取数据。 -
FULL OUTER JOIN
– 提取数据(如果存在于两个表中的任何一个中)。
-
-
顾名思义, CROSS JOIN就是把所有东西都连接起来的
[n X m]
。
类似于我们仅仅列出要join的表(在SELECT
语句的FROM
子句中)的情况,使用逗号分隔它们。
需要注意的是:
- 如果你只是提到
JOIN
那么默认情况下它是一个INNER JOIN
。 -
OUTER
连接必须是LEFT
|RIGHT
| 你不能简单地说OUTER JOIN
。 - 你可以删除
OUTER
关键字,只是说LEFT JOIN
或RIGHT JOIN
或FULL JOIN
。
对于那些想要更好地形象化的人,请点击此链接: SQL连接的可视化解释
左连接和左外连接有什么区别?
没事 LEFT JOIN
和LEFT OUTER JOIN
是等价的。
阅读更多关于SQL联接的可视化表示
我是一名PostgreSQL数据库pipe理员,就我所能理解的外部或外部连接差异而言,差异是一个在互联网上有相当多讨论的话题。 直到今天,我从来没有看到这两者之间的区别。 所以我走得更远,我试图找出这些之间的差异。 最后,我读了关于它的整个文档,我find了答案,
所以,如果你看文档(至less在PostgreSQL),你可以find这个短语:
“ INNER
和OUTER
在所有forms中都是可选的, INNER
是默认的, LEFT
, RIGHT
和FULL
意味着一个外连接。
换句话说,
LEFT JOIN
和LEFT OUTER JOIN
是相同的
RIGHT JOIN
和RIGHT OUTER JOIN
是相同的
我希望这可以为那些仍在努力寻找答案的人提供帮助。
除此之外没有什么可说的话:
我发现按以下顺序考虑联接更容易:
- CROSS JOIN – 这两个表的笛卡尔积。 所有连接从这里开始
- INNER JOIN – 添加了filter的CROSS JOIN。
- 外部连接 – 一个内部连接,缺less的元素(从左边或右边的表格)之后添加。
直到我find这个(相对)简单的模型,JOINS总是多一点黑色艺术。 现在他们理所当然
希望这有助于超过它的混淆。
为什么左/右和左外/右外都一样? 让我们来解释为什么这个词汇。 理解LEFT和RIGHT连接是OUTER连接的具体情况,因此不能只是外部连接的左边/右边连接。 OUTER连接也被称为FULL OUTER,而LEFT和RIGHT连接则是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)
现在很清楚为什么这些操作有别名,而且很明显只有三种情况存在:INNER,OUTER,CROSS。 有两个子shell的情况。 词汇,老师解释这个的方式,以及上面的一些答案,往往使它看起来像有很多不同types的联接。 但其实很简单
Left Join
和Left Outer Join
是一个相同的 。 前者是后者的简写。 关于Right Join
和Right Outer Join
关系也是如此。 示范将说明平等。 每个查询的工作示例都通过SQL Fiddle提供。 这个工具将允许双手操作查询。
特定
左连接和左外连接
结果
正确的join和正确的外部join
结果
主要有三种types的JOIN
- Inner:获取两个表中存在的数据
- 只有join意味着内部join
-
外:有三种types
- LEFT OUTER – 只在左表中提取数据&匹配条件
- RIGHT OUTER – 只在右表和匹配条件下提取数据
- FULL OUTER – 提取任何或两个表中的数据
- (左或右或全)外部连接可以不写入“外部”
-
交叉join:将一切都join到一切
句法糖,对于偶然的读者来说更加明显的是,连接不是内在的。
回答你的问题
在Sql Server连接语法中OUTER是可选的
它在msdn文章中提到: https ://msdn.microsoft.com/en-us/library/ms177634( v= sql.130).aspx
所以下面的列表显示了有和没有OUTER的连接等价语法
LEFT OUTER JOIN => LEFT JOIN RIGT OUTER JOIN => RIGHT JOIN FULL OUTER JOIN => FULL JOIN
其他等效的语法
INNER JOIN => JOIN CROSS JOIN => ,
强烈推荐Dotnet Mob Artice: joinSql Server
只有3个连接:
- A)交叉连接=笛卡尔(例如:表A,表B)
- B)内部联接= JOIN(例如:表A联接/内部联接表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
希望它能帮上忙。
LEFT JOIN
从第一个(最左边的)表开始,然后与第二个(最右侧的)表logging匹配。
LEFT JOIN
和LEFT OUTER JOIN
是一样的。
根据DoFactory
没有。
LEFT JOIN,默认情况下是OUTER。
我知道这是旧的,但想要把我的两分钱。我明白, LEFT JOIN
应该是一样的LEFT OUTER JOIN
但在我的经验,我看到一个LEFT JOIN
拉回不同的结果比LEFT OUTER JOIN
所以我已经开始使用关键词OUTER
来更加具体和恰当。 本来应该回到LEFT JOIN
行不会像在我使用LEFT OUTER JOIN
时那样。 当我试图向同事解释这一点时,他无法得到他需要的行,所以我决定谷歌的差异,以便有一些支持,以显示他。 这可能是我不确定的SQL Server特定的事情。 我想说,在良好的实践中,明确指出你希望发生一个外连接会更明智。 只是我的意见。