SQL Server中LEFT JOIN与LEFT OUTER JOIN的对比

SQL Server中LEFT JOIN与LEFT OUTER JOIN的对比

技术背景

在 SQL Server 数据库操作中,连接(JOIN)是一种常见且重要的操作,用于从多个表中获取数据。其中,LEFT JOIN 和 LEFT OUTER JOIN 是经常被使用的连接方式,但很多开发者对它们之间的关系存在疑问。理解它们的区别和联系,对于准确编写 SQL 查询语句至关重要。

实现步骤

1. 理解 SQL Server 中 JOIN 语法

在 SQL Server 中,JOIN 语法的定义如下:

1
2
3
<join_type> ::= 
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN

从上述语法可以看出,关键字 OUTER 是可选的(用方括号括起来)。这意味着在 LEFT JOIN 和 LEFT OUTER JOIN 的情况下,是否指定 OUTER 没有区别。

2. 不同 JOIN 类型的使用

  • INNER JOIN:如果只指定 JOIN,默认就是 INNER JOIN,它会返回两个表中匹配的记录。例如:
1
2
SELECT *
FROM A JOIN B ON A.X = B.Y
  • OUTER JOIN:分为三种类型
    • LEFT OUTER JOIN(等同于 LEFT JOIN):返回左表中的所有记录,以及右表中匹配的记录。如果右表中没有匹配的记录,则用 NULL 填充。
    • RIGHT OUTER JOIN(等同于 RIGHT JOIN):返回右表中的所有记录,以及左表中匹配的记录。如果左表中没有匹配的记录,则用 NULL 填充。
    • FULL OUTER JOIN(等同于 FULL JOIN):返回两个表中所有匹配和不匹配的记录。
  • CROSS JOIN:它会对两个表进行笛卡尔积操作,即左表的每一行与右表的每一行都进行组合。

3. 理解 JOIN 的本质

可以按照以下顺序来理解 JOIN:

  • CROSS JOIN:是所有连接的基础,它产生两个表的笛卡尔积。
  • INNER JOIN:是在 CROSS JOIN 的基础上添加了过滤条件。
  • OUTER JOIN:是在 INNER JOIN 的基础上,添加了左表或右表中缺失的元素。

核心代码

以下是一些不同 JOIN 类型的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- INNER JOIN
SELECT *
FROM A INNER JOIN B ON A.X = B.Y;

-- LEFT JOIN
SELECT *
FROM A LEFT JOIN B ON A.X = B.Y;

-- LEFT OUTER JOIN(等同于 LEFT JOIN)
SELECT *
FROM A LEFT OUTER JOIN B ON A.X = B.Y;

-- RIGHT JOIN
SELECT *
FROM A RIGHT JOIN B ON A.X = B.Y;

-- RIGHT OUTER JOIN(等同于 RIGHT JOIN)
SELECT *
FROM A RIGHT OUTER JOIN B ON A.X = B.Y;

-- FULL JOIN
SELECT *
FROM A FULL JOIN B ON A.X = B.Y;

-- FULL OUTER JOIN(等同于 FULL JOIN)
SELECT *
FROM A FULL OUTER JOIN B ON A.X = B.Y;

-- CROSS JOIN
SELECT *
FROM A CROSS JOIN B;

最佳实践

  • 虽然 OUTER 关键字是可选的,但在编写 SQL 语句时,为了提高代码的可读性,特别是对于新手开发者,可以明确写出 OUTER 关键字,让代码更清晰地表达意图。
  • 在使用 JOIN 时,确保连接条件(如 ON 子句)的正确性,避免产生不必要的笛卡尔积或错误的结果。

常见问题

1. 为什么 LEFT JOIN 和 LEFT OUTER JOIN 是相同的?

LEFT JOIN 和 LEFT OUTER JOIN 本质上是相同的,LEFT JOIN 是 LEFT OUTER JOIN 的简写形式。这是因为 LEFT 和 RIGHT 连接是 OUTER 连接的特殊情况,所以它们本质上就是 OUTER 连接。

2. JOIN 和 INNER JOIN 有什么区别?

在 SQL Server 中,JOIN 和 INNER JOIN 是等价的,JOIN 是 INNER JOIN 的默认简写形式。

3. APPLY 运算符与 JOIN 有什么关系?

CROSS APPLY 类似于 INNER JOIN,但它可以为左表的每一行在右表中计算某些值,并只返回匹配的行。OUTER APPLY 类似于 LEFT OUTER JOIN,它会返回左表的所有行,无论右表中是否有匹配的行。APPLY 运算符在性能上可能优于子查询,并且在旧版本的 SQL Server 中可以替代一些分析函数。


SQL Server中LEFT JOIN与LEFT OUTER JOIN的对比
https://119291.xyz/posts/sql-server-left-join-vs-left-outer-join/
作者
ww
发布于
2025年5月22日
许可协议