提问人:KG Sosa 提问时间:1/2/2009 最后编辑:QuiverKG Sosa 更新时间:9/6/2023 访问量:2089308
SQL Server 中的左联接与左外联接
LEFT JOIN vs. LEFT OUTER JOIN in SQL Server
答:
左连接和左外连接有什么区别?
什么都没有。 并且是等价的。LEFT JOIN
LEFT OUTER JOIN
评论
根据文档:FROM (Transact-SQL):
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
关键字标记为可选(用方括号括起来)。在这种特定情况下,是否指定没有区别。请注意,虽然 join 子句的其他元素也被标记为可选,但将它们排除在外会有所不同。OUTER
OUTER
例如,子句的整个 type-part 是可选的,在这种情况下,默认值是 if you just 指定 .换句话说,这是合法的: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 FROM 行上的多个表?。
评论
INNER JOIN
JOIN
JOIN
OUTER
句法糖,使普通读者更清楚地知道连接不是内部连接。
评论
我是一名 PostgreSQL DBA。外部连接与非外部连接之间的区别是一个在互联网上有大量讨论的话题。
如果您查看 PostgreSQL 文档:
单词 和 在所有形式中都是可选的。 是默认值;、 和 表示外部连接。(http://www.postgresql.org/docs/8.4/static/queries-table-expressions.html
INNER
OUTER
INNER
LEFT
RIGHT
FULL
)
换言之,
左连接和
左外连接
相同
右连接和
右外连接
是相同的
和之间没有区别,它们完全相同。LEFT JOIN
LEFT OUTER JOIN
在顶层,主要有 3 种类型的联接:
INNER JOIN
如果两个表中都存在数据,则提取数据。OUTER JOIN
有 3 种类型:LEFT OUTER JOIN
- 如果左表中存在数据,则获取数据。RIGHT OUTER JOIN
- 如果数据存在于正确的表中,则获取数据。FULL OUTER JOIN
- 如果数据存在于两个表中的任何一个中,则获取数据。
CROSS JOIN
,顾名思义,做 n 次 m 配对,将一切连接起来。 这类似于我们简单地列出要连接的表(在语句的子句中),使用逗号分隔它们。FROM
SELECT
注意事项:
- 如果你只是提到,那么默认情况下它是一个.
JOIN
INNER JOIN
- 联接必须是 | | ;你不能简单地说.
OUTER
LEFT
RIGHT
FULL
OUTER JOIN
- 您可以删除关键字,然后只说 or 或 。
OUTER
LEFT JOIN
RIGHT JOIN
FULL JOIN
评论
Cross Join
Full Outer Join
我发现按以下顺序考虑 Joins 更容易:
- CROSS JOIN - 两个表的笛卡尔乘积。所有联接都从这里开始
- INNER JOIN - 添加了过滤器的 CROSS JOIN。
- OUTER JOIN - 缺少元素的 INNER JOIN(来自 LEFT 或 RIGHT 表) 之后添加。
在我弄清楚这个(相对)简单的模型之前,JOINS总是更像是一门黑色艺术。现在它们非常有意义。
评论
JOIN主要有三种类型
- Inner:获取两个表中都存在的数据
- 只有 JOIN 表示 INNER JOIN
外层:有三种类型
- LEFT OUTER - - 获取仅存在于左表和匹配条件中的数据
- RIGHT OUTER - - 获取仅存在于正确表和匹配条件中的数据
- FULL OUTER - - 获取存在任何或两个表的数据
- (左或右或全)OUTER JOIN可以写成不写“OUTER”
交叉连接:将所有内容连接到所有内容
为什么 LEFT/RIGHT 和 LEFT OUTER/RIGHT OUTER 相同?让我们解释一下为什么会有这个词汇。 了解 LEFT 和 RIGHT 连接是 OUTER 连接的特定情况,因此只能是 OUTER LEFT/OUTER RIGHT 之外的任何东西。OUTER 连接也称为 FULL OUTER,与作为 OUTER 连接的 PARTIAL 结果的 LEFT 和 RIGHT 连接相反。事实上:
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 有两个子案例。 词汇,老师解释这一点的方式,以及上面的一些答案,往往使它看起来有很多不同类型的连接。但其实很简单。
评论
JOIN
INNER JOIN
Left Join
并且是一回事。前者是后者的简写。和关系也是如此。该演示将说明平等。每个查询的工作示例已通过 SQL Fiddle 提供。此工具将允许动手操作查询。Left Outer Join
Right Join
Right Outer Join
鉴于
左连接和左外连接
结果
右连接和右外连接
结果
评论
在 SQL Server 中,联接语法是可选的。OUTER
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 文章中的插图(强烈推荐) Joins in Sql Server:
只有 3 个联接:
交叉连接 = 笛卡尔连接(例如:表 A、表 B)
内部联接 = JOIN(例如:表 A 联接/内部联接表 B)
外部连接
有三种类型:
- 左外连接 = 左连接
- 右外连接 = 右连接
- 完全外部连接 = 完全连接
评论
加入:
INNER JOIN
=JOIN
OUTER JOIN
LEFT OUTER JOIN
=LEFT JOIN
RIGHT OUTER JOIN
=RIGHT JOIN
FULL OUTER JOIN
=FULL JOIN
CROSS JOIN
Self-:这不完全是一种单独的联接类型。这是使用上述联接之一将表联接到自身。您将从 SQL 开发人员社区中的许多人那里听到这个术语。JOIN
有两个 APPLY 运算符:
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 运算符。
在 SQL 中,术语“LEFT JOIN”和“LEFT OUTER JOIN”通常可以互换使用。这两种联接类型都返回左侧表(在 JOIN 关键字之前指定的表)中的所有行,以及从右侧表(在 JOIN 关键字之后指定的表)中返回匹配的行。但是,它们处理不匹配行的方式略有不同。
左连接或左外连接包括左表中的所有行,而不管右表中是否存在匹配项。如果没有匹配项,则结果将在右表的列中包含 NULL 值。
下面是一个示例来说明差异:
假设我们有两个表,Customers 和 Orders,它们有一个通用的列 CustomerID:
客户表:
CustomerID | CustomerName
-----------|--------------
1 | John
2 | Mary
3 | David
订单表:
OrderID | CustomerID | OrderDate
--------|------------|-----------
101 | 1 | 2023-01-01
102 | 2 | 2023-02-01
在这些表之间使用 LEFT JOIN 或 LEFT OUTER JOIN,结果为:
SELECT *
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
结果:
CustomerID | CustomerName | OrderID | CustomerID | OrderDate
-----------|--------------|---------|------------|-----------
1 | John | 101 | 1 | 2023-01-01
2 | Mary | 102 | 2 | 2023-02-01
3 | David | NULL | NULL | NULL
如您所见,LEFT JOIN 返回左侧表 (Customers) 中的所有行,包括右侧表 (Orders) 中的列中值为 NULL 的不匹配行 (David)。
使用 dbForge Query Builder for SQL Server,您可以轻松选择所需的联接类型(包括 LEFT JOIN 或 LEFT OUTER JOIN),并直观地构建查询,而无需手动编写 SQL 代码。
评论