LEFT JOIN和LEFT OUTER JOIN有什么区别?
根据文档:来自(Transact-SQL):
1 2 3
| <join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN |
关键字OUTER标记为可选(用方括号括起来),在这种情况下,这意味着无论您指定与否都没有区别。请注意,尽管join子句的其他元素也被标记为可选,但将它们去掉当然会有区别。
例如,JOIN子句的整个类型部分是可选的,在这种情况下,如果只指定JOIN则默认为INNER。换句话说,这是合法的:
1 2
| SELECT *
FROM A JOIN B ON A.X = B.Y |
下面是等价语法的列表:
1 2 3 4
| 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 |
另外,看看我在另一个问题上留下的答案:SQL左联接vs多个表在FROM行上?.
- 完全正确。允许外部兼容ANSI-92。
- @卡尔森,在等价物列表中,让INNER JOIN在右边,而只有JOIN在左边,这样会更好吗?
- @卡尔森,我的意思是左边有简洁的形式,右边有扩展的形式。我想,如果你也按照同样的方法来对待JOIN,这会使事情变得连贯。
- @Seanrelly您是说外部是ANSI-92兼容所必需的吗?或者,您是说微软更喜欢去掉外部的,但如果有人使用标准的SQL(必须包括外部的)来运输,那么就把它作为一个选项留下?
- @whytheq:第一条语句("outer是ansi-92兼容性所必需的)绝对正确,afaik。A LEFT OUTER JOIN B和A LEFT JOIN B在mssql中做了同样的事情,但是只有第一个例子与ansi-92兼容。第二句话("微软倾向于省略外部内容,但将其作为一种选择,以防…")也可能是正确的(它简洁,不会牺牲那么多的可读性)。当然,我不知道微软在做什么,也不喜欢做什么,但这似乎是明智的。当第三方程序向您发送ANSIStandardSQL时不要崩溃是个好主意…
- @Seanrelly感谢Sean——它回避了一个问题,"因为这是标准,为什么要让外部可选?"
- @whytheq:我不确定,但我猜随着时间的推移,随着时间的推移,ANSI-92的兼容性作为一系列的修复程序加入了进来。他们不想通过使(以前可接受的)非标准语法非法来引入向后兼容性错误。因此,他们开始接受ansi标准语法中所需的术语,但使其成为可选的。
- 如果你只是说左连接,你是从内部还是从外部?对我来说,你的回答似乎模棱两可。
- "关键字outer被标记为可选(括在方括号中),在这种情况下,这意味着无论您是否指定它,都不会有任何区别"<--您得到一个外部联接。
- 只需像@sactiw那样提到"关键字outer被标记为可选"。为什么回答这么长?浪费时间……如果答案是有意义的,那就更好了。而不是毫无意义。对不起,太苛刻了。
- @离群值,这是你的特权,但显然451其他人认为答案是好的。老实说,如果一个答案说X,另一个答案说X,并引用文档,同时将文档的相关部分复制到答案中,那么我的投票将转到第二个答案,这就是为什么我会像这样写答案。有人说X不好。如果你能证明x,那就更好了(不要轻视sactiw的回答)。但是,你有权想什么就想什么。我问你为什么认为这是毫无意义的,但是答案是错误的吗?
- @离群值这是我今天发布的另一个长答案(又称"无意义"),遵循同样的模式:stackoverflow.com/questions/24852609/&hellip;
- @更离群的是,老实说,如果你不想读我的"长"答案,那么我的答案不适合你。这是为了让其他来到这里的人想知道同样的事情,想知道为什么会这样,在哪里可以找到更多的信息,等等。很明显,你是那种想要这个答案的人:"没有",但不幸的是,这不是一个合法的答案,在堆栈溢出时,也不应该这样。
- 喜欢解释差异的图表。
- 很好的解释,特别是图表让我们清楚地记得。+解释得这么清楚。谢谢
- 根据标准sql OUTER也是一个可选关键字::=inner[outer]
- 这里的维恩例子是崇高的。所有的连接现在对我来说都是完全意义上的。多谢一万次!!!!
- 一般来说,这是一个非常彻底的关于连接的答案,但我倾向于同意@outlier,这里所需的答案可以更简洁地回答非常具体的问题。
- 答案要简洁得多,也要切中要害,但人们要求我在评论中对其他连接做更多的描述。
To answer your question there is no difference between LEFT JOIN
and LEFT OUTER JOIN, they are exactly same that said...
在顶层,连接主要有3种类型:
内
外
十字架
内部联接-如果两个表中都存在,则提取数据。
外部连接有3种类型:
LEFT OUTER JOIN—如果左表中存在,则提取数据。
RIGHT OUTER JOIN—如果右表中存在,则提取数据。
FULL OUTER JOIN—如果两个表中的任何一个表中存在,则提取数据。
交叉连接,顾名思义,是连接一切的[n X m]。类似于我们简单列出要加入的表的场景(在SELECT语句的FROM子句中),使用逗号将它们分开。
注意事项:
- 如果你只提到JOIN,那么默认情况下它是INNER JOIN。
- 一个OUTER连接必须是LEFTRIGHTFULL,你不能简单地说OUTER JOIN。
- 您可以删除OUTER关键字,只需说LEFT JOIN或RIGHT JOIN或FULL JOIN即可。
对于希望以更好的方式可视化这些内容的用户,请访问以下链接:SQL联接的可视化解释
- 回答得很好。对于2.1(和2.2的类似变化),如果您说"左外部联接-从左表中提取所有数据,如果是预设的,则从右表中获取匹配数据",会更清楚。
- 也可以通过简单地"从表A中选择*表B"进行交叉联接。
- 对不起,如果我有必要的话,请问CROSS JOIN和FULL JOIN是一样的吗?
- @不,交叉联接是笛卡尔积,即表的交叉联接,有n行,有一个表,有m行,总是给出(n*m)行,而表的完全外部联接,有n行,有一个表,有m行,将给出最大(n+m)行。
What is the difference between left join and left outer join?
没有什么。LEFT JOIN和LEFT OUTER JOIN是等效的。
- 呃,你好!谁投了反对票?左连接与左外部连接相同。
- 这在Microsoft SQL Server和任何其他SQL兼容的RDBMS中都是如此。
- 如果您添加一个参考或解释为什么OUTER是可选的,那就太好了。
- 它是可选的,因为它是不必要的!
- 最简洁、最准确的答案。
- @有核小麦如果不必要,为什么要生下来?
- @凯文布:我不知道,我不负责写语言定义。但无论如何,这是不必要的。噢,还有投票否决权
- 谢谢您。被接受的答案有太多的信息,让我更加困惑。这正是我需要知道的,并且直接回答了最初的问题。
我是一个PostgreSQL DBA,据我所知,外部连接和非外部连接之间的区别是一个在互联网上引起广泛讨论的话题。直到今天,我才发现这两者之间有什么不同,所以我更进一步,试图找出两者之间的区别。最后,我阅读了有关它的全部文档,找到了答案,
因此,如果您查看文档(至少在PostgreSQL中),您可以找到以下短语:
"单词INNER和OUTER在所有形式中都是可选的。默认为INNER;LEFT、RIGHT和FULL表示外部联接。"
换句话说,
LEFT JOIN与LEFT OUTER JOIN相同
RIGHT JOIN与RIGHT OUTER JOIN相同
我希望这能对那些仍在努力寻找答案的人有所帮助。
LEFT JOIN和LEFT OUTER JOIN是同一个。前者是后者的简称。关于Right Join和Right Outer Join的关系也可以这样说。示范将说明平等。每个查询的工作示例都是通过SQL fiddle提供的。此工具将允许手动操作查询。
鉴于
左联接和左外联接
结果
右联接和右外联接
结果
我发现按以下顺序考虑连接更容易:
- 交叉联接-两个表的笛卡尔积。所有连接都从这里开始
- 内部连接-添加了过滤器的交叉连接。
- 外部联接-缺少元素的内部联接(从左表或右表)之后添加。
在我找到这个(相对)简单的模型之前,连接一直是一种黑色艺术。现在它们完全有意义了。
希望这能帮助你,而不是让你困惑。
为什么左/右和左外/右外相同?让我们解释一下这个词汇表的原因。请理解,左联接和右联接是外部联接的特定情况,因此不能是外部左/外部右联接以外的任何情况。外部联接也被称为完全外部联接,而不是外部联接的部分结果的左联接和右联接。的确:
1 2 3 4 5 6 7 8 9
| 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种情况存在:内部、外部、交叉。外部有两个子案例。词汇表,老师解释这一点的方式,以及上面的一些答案,常常让人觉得有很多不同类型的连接。但其实很简单。
- "很明显只有3个案例":有趣但有缺陷。考虑一个内部联接是一个专门的交叉联接(即,将联接谓词移动到WHERE子句)。进一步考虑,外部联接根本不是联接,而是使用空值代替"缺少"列的联合。因此,可以说交叉是唯一需要的连接。注意,当前关系理论中的思想是自然连接满足所有连接需求。旁白:你能解释一下"JOIN意味着INNER JOIN这个词汇是否与你对外部连接词汇的推理相符吗?
回答你的问题
In Sql Server joins syntax OUTER is optional
它在msdn文章中提到:https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx
所以下面的列表显示了带有或不带有外部的连接等价语法
1 2 3
| LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN |
其他等效语法
1 2
| INNER JOIN => JOIN
CROSS JOIN => , |
强烈推荐dotnet mob artie:加入SQL Server
只有3个连接:
- a)交叉连接=笛卡尔(例如:表A、表B)
- b)内部联接=联接(例如:表A联接/内部联接表B)
c)外部连接:
1 2 3 4
| 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 |
希望能有所帮助。
连接主要有三种类型
内部:获取两个表中都存在的数据
外部:有三种类型
- 左外部提取仅在左表和匹配条件中存在的数据
- 右外部提取仅在右表和匹配条件下存在的数据
- 完整的外部提取数据显示任何或两个表
- (左、右或全)外部联接可以写,不写"外部"
交叉连接:将一切连接到一切
句法上的甜言蜜语,让不经意的读者更清楚地认识到连接不是一个内在的连接。
- 所以…那么什么是完全外部连接呢?
- 表A全外部联接表B将提供三种类型的记录:表A中的所有记录在表B中没有匹配记录,表B中的所有记录在表A中没有匹配记录,表A中的所有记录在表B中有匹配记录。
我知道这是旧的,但想把我的两分钱。我知道LEFT JOIN应该和LEFT OUTER JOIN一样,但在我的经验中,我看到LEFT JOIN收回了与LEFT OUTER JOIN不同的结果,所以我开始使用关键字OUTER来更加具体和恰当。本来应该放在LEFT JOIN中的行没有像我使用LEFT OUTER JOIN时那样出现在哪里。我正试图向一位同事解释这一点,当时他无法获得他需要的行,所以我决定谷歌差异,以便有某种支持来向他展示。这可能是我不确定的特定于SQL Server的事情。我会说,在良好的实践中,更明智的做法是显式地声明希望发生外部联接。只是我的意见。
- 如果你得到了不同的结果,那么你就会碰到一个错误,因为两者的行为必须相同。
- 您的数据库环境?