LEFT JOIN和LEFT OUTER JOIN之间的区别是什么?
当前回答
根据文档:FROM(Transact-SQL):
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
关键字OUTER标记为可选(括在方括号中)。在这种特定情况下,是否指定OUTER没有任何区别。请注意,虽然join子句的其他元素也被标记为可选的,但将它们排除在外会有所不同。
例如,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左连接与FROM行上的多个表?。
其他回答
我是一名PostgreSQL DBA,据我所知,外部连接和非外部连接之间的区别是一个在互联网上有大量讨论的话题。直到今天,我从未看到这两者之间的区别;所以我更进一步,我试图找出它们之间的区别。最后,我阅读了关于它的全部文档,我找到了答案,
因此,如果您查看文档(至少在PostgreSQL中),您可以找到以下短语:
INNER和OUTER在所有形式中都是可选的。INNER是默认值;LEFT、RIGHT和FULL表示外部连接
换句话说,
左联接和左外部联接相同
右联接和右外部联接相同
我希望它能为那些仍在努力寻找答案的人做出贡献。
就在这个问题的上下文中,我还想发布2个“APPLY”运算符:
连接:
内部联接=联接外部连接左外部联接=左联接右外部联接=右联接完全外部连接=完全连接交叉连接
SelfJOIN:这不是一种单独的联接类型。这基本上是使用上述连接之一将表连接到自身。但我觉得在JOIN讨论中值得一提,因为您将从SQL Developer社区的许多人那里听到这个术语。
应用:
CROSS APPLY——类似于INNER JOIN(但增加了一个优点,即能够为Left表的每一行在Right表中计算一些值,并且只返回匹配的行)OUTER APPLY——类似于LEFT OUTER JOIN(但它增加了一个优点,即能够为LEFT表的每一行计算Right表中的某些内容,并且无论Right表中是否匹配,都会返回LEFT表中的所有行)
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中的许多分析函数。这就是为什么我相信在熟悉JOIN之后,一个SQL开发人员接下来应该尝试学习APPLY运算符。
语法糖,让不经意的读者更清楚地看到,连接不是内在的。
JOIN主要有三种类型
内部:获取两个表中存在的数据仅JOIN表示INNER JOIN外部:有三种类型LEFT OUTER--仅获取左表匹配条件中的数据RIGHT OUTER--仅获取右表匹配条件下的数据FULL OUTER—获取任何或两个表中的数据(LEFT或RIGHT或FULL)OUTER JOIN可以不写“OUTER”交叉连接:将所有内容连接到所有内容
根据文档:FROM(Transact-SQL):
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
关键字OUTER标记为可选(括在方括号中)。在这种特定情况下,是否指定OUTER没有任何区别。请注意,虽然join子句的其他元素也被标记为可选的,但将它们排除在外会有所不同。
例如,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左连接与FROM行上的多个表?。
推荐文章
- 确定记录是否存在的最快方法
- 从现有模式生成表关系图(SQL Server)
- 我如何循环通过一组记录在SQL Server?
- 数据库和模式的区别
- 如何在SQL Server中一次更改多个列
- 外键约束可能导致循环或多条级联路径?
- 如何选择每一行的列值不是独特的
- nvarchar(max)非文本
- 在SQL Server 2008 R2中重命名数据库时出错
- 将数据复制到另一个表中
- 如何在SQL中选择表的最后一条记录?
- 修改列,添加默认约束
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?