{count, plural, other {课程}}
对于从事关系型数据库工作的任何人来说,理解 SQL 连接的细微差别至关重要。在本教程中,我们将深入了解 SQL 中的 LEFT JOIN 和 LEFT OUTER JOIN。
如果您希望精通 SQL 并提升查询能力,可以参加类似 Joining Data in SQL 的课程,这将真正帮助您理解单表与双表连接之间那些细微但重要的差异。
LEFT JOIN 与 LEFT OUTER JOIN
LEFT JOIN 与 LEFT OUTER JOIN 之间没有区别。它们是可以互换使用的 SQL 功能。二者完全相同:都会返回左表的所有行,以及右表中与之匹配的行。
我们来看一个真实示例,亲自验证 LEFT JOIN 和 LEFT OUTER JOIN 的等价性。为此,我们将创建并使用两个示例表:Employees 和 Departments。
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
INSERT INTO Departments (DepartmentID, DepartmentName) VALUES
(1, 'HR'),
(2, 'IT'),
(3, 'Finance'),
(4, 'Marketing');
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(50),
DepartmentID INT,
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);
INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID) VALUES
(1, 'Alice', 1),
(2, 'Bob', 2),
(3, 'Charlie', NULL),
(4, 'David', 3);
LEFT JOIN
现在我们的两个表已准备就绪,试着运行一个使用 LEFT JOIN 的查询。
SELECT Employees.EmployeeID, Employees.EmployeeName,
Departments.DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

LEFT JOIN 函数的输出。图片来源:作者
该 LEFT JOIN 查询返回了左表 Employees 的所有行,以及右表 Departments 中匹配的行。如果没有匹配,右侧的 Departments 表对应列会返回 NULL 或缺失值。
LEFT OUTER JOIN
现在用 LEFT OUTER JOIN 再试一次:
SELECT Employees.EmployeeID, Employees.EmployeeName, Departments.DepartmentName
FROM Employees
LEFT OUTER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

LEFT OUTER JOIN 函数的输出。图片来源:作者
您可以看到,这两个查询的输出完全相同。
LEFT JOIN 或 LEFT OUTER JOIN 的使用场景
LEFT JOIN / LEFT OUTER JOIN 在多种情境下都非常有用。以下是一些示例。
-
识别未匹配记录:您可以使用
LEFT JOIN或LEFT OUTER JOIN来查找一个表中在另一个表中没有匹配记录的数据。在上述查询中,您可以看到我们的朋友 Charlie 并未被映射到任何部门。 -
数据完整性检查:您可以使用
LEFT JOIN或LEFT OUTER JOIN通过检查缺失或不匹配的记录来确保跨表数据一致性。例如,我们可以使用WHERE子句筛选结果集,仅包含Departments.DepartmentID为NULL或缺失的行。 -
合并相关数据:使用
LEFT JOIN或LEFT OUTER JOIN将相关表的数据合并为一份完整的报告。这种方法可以汇聚多个来源的信息,为您的数据提供全景视图。
性能考量与进阶技巧
尽管 LEFT JOIN 和 LEFT OUTER JOIN 的用法直观,但仍有若干性能考量与进阶技巧需要注意。
对查询性能的影响
LEFT JOIN/LEFT OUTER JOIN 在处理大型数据集时可能影响性能。随着表中行数的增加,处理连接并返回结果所需的时间也会增加。因此,务必考虑相关表的规模,并对查询进行高效优化。
通过索引优化性能的策略
在参与连接条件的列上使用索引可以显著提升处理速度。索引有助于数据库更快地在表之间查找并匹配行。比如,如果您经常基于 DepartmentID 连接表,那么在两个表的 DepartmentID 列上创建索引将加速处理,使查询更高效、更灵敏。
与其他连接类型的对比
理解何时使用不同的连接(INNER JOIN、RIGHT JOIN、FULL OUTER JOIN)对于优化查询很重要。当您需要左表的所有记录时,LEFT JOIN 或 LEFT OUTER JOIN 尤其有用。如果不需要左表的全部记录,请考虑其他类型的连接。
与子查询配合使用
子查询(也称为内部查询或嵌套查询)在复杂的数据检索场景中大有裨益。将其与 LEFT JOIN 或 LEFT OUTER JOIN 结合使用时,子查询可以帮助您筛选与聚合数据、有条件地连接表,并将复杂查询拆解为更易管理的部分。
结语
在 SQL 中理解 LEFT JOIN 和 LEFT OUTER JOIN 对于有效的数据管理、报告与分析至关重要。尽管它们功能相同,但了解各自的使用场景、性能影响与进阶技巧,将有助于您更好地运用这两种连接方式。 若要进一步学习,建议探索以下资源:
- Introduction to SQL:学习如何使用 SQL 创建并查询关系型数据库。
- SQL Fundamentals: 掌握与数据交互和查询所需的基础 SQL 技能。
- Learn SQL:获取这种高需求编程语言的知识,用于管理关系型数据库中的数据。
- Reporting in SQL:通过这门实践课程,您将学会构建自己的 SQL 报告和仪表板,并打磨数据探索、清洗与验证技能。
常见 SQL 问答
LEFT JOIN 和 LEFT OUTER JOIN 有什么区别?
没有区别;LEFT JOIN 与 LEFT OUTER JOIN 执行相同功能,可以互换使用。
我应该在何时使用 LEFT JOIN?
当您需要左表的所有记录以及右表中匹配的记录时,使用 LEFT JOIN。右表未匹配的记录其对应列将为 NULL。
LEFT JOIN 会返回比左表更多的行吗?
不会。LEFT JOIN 返回左表的所有行以及右表中匹配的行,但不会增加左表的行数。
如何处理 LEFT JOIN 结果中的 NULL 值?
您可以使用 COALESCE 函数在结果集中将缺失值替换为默认值。
LEFT JOIN 的常见用例有哪些?
常见用例包括识别未匹配记录、执行数据完整性检查,以及在 ETL 过程中合并数据集。
