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

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

技术背景

在 SQL Server 数据库操作中,连接(JOIN)是一种常见且重要的操作,用于从多个表中获取数据。其中,LEFT JOINLEFT 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 JOINLEFT 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 JOINLEFT OUTER JOIN 是相同的?

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

2. JOININNER JOIN 有什么区别?

在 SQL Server 中,JOININNER JOIN 是等价的,JOININNER 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日
许可协议