跳至主要内容

SQL INNER JOIN 与 OUTER JOIN:关键区别

通过示例和可视化了解 SQL INNER JOIN 与 OUTER JOIN,提升您的数据库管理技能。
· 4分钟 阅读

使用 AI 探索

在本教程中,我将解释 SQL INNER JOIN 与 OUTER JOIN 的区别,并配以示例。读完之后,您可能还想学习我们的Joining Data in SQL 课程,涵盖其他有趣的连接类型,如 SELF JOIN 和 CROSS JOIN,以及更宏观的概念,比如集合论。

快速答案

INNER JOIN 会基于共有列仅返回表间匹配的行,排除不匹配的行。比如,下面的查询只有在存在匹配时才显示带有客户详情的订单。

-- Inner Join: Returns only matching rows from both tables
SELECT o.OrderID, c.CustomerName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID;

OUTER JOIN 会包含匹配行以及来自一个或两个表的不匹配行。下面的查询返回所有客户,包括那些没有订单的客户。

-- Left Outer Join: Returns all rows from Customers and matching rows from Orders
SELECT c.CustomerName, o.OrderID
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;

深入了解 SQL 的 INNER JOIN 与 OUTER JOIN

下面我们分别更仔细地看看 SQL 的 INNER JOIN 和 OUTER JOIN。在讲解过程中,请参考以下两张表:

员工表示例。

员工表示例。作者供图。

部门表示例。

部门表示例。作者供图。

INNER JOIN 的工作原理

INNER JOIN 仅根据指定条件检索两张表中都有匹配的行。

以下查询选择 employee_id、demployee_name、department_name 和 salary,并仅返回存在 department_id 的行。

-- Example: Get employees with matching departments
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
INNER JOIN departments
-- Returns only employees assigned to a department
ON employees.department_id = departments.department_id;

使用 SQL INNER JOIN 合并后的表示例。

使用 SQL INNER JOIN 合并后的表示例。作者供图。

OUTER JOIN 的工作原理

OUTER JOIN 会根据所用类型,包含来自一个或两个表的不匹配行。

LEFT OUTER JOIN(LEFT JOIN)

LEFT OUTER JOIN 返回左表的所有记录,以及右表中匹配的记录。若无匹配,右表的列将返回 NULL。

下面的示例会检索 employees 表中的所有记录,即使存在不匹配的情况。员工缺失的 department_name 将以 NULL 返回。

-- Get all employees, even those without a department
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;

使用 SQL 左外连接合并后的表示例

使用 SQL 左外连接合并后的表示例。作者供图。

LEFT JOIN 与 LEFT OUTER JOIN 在 SQL 中可互换使用,因为这两种查询都会获取左表的所有行以及右表中匹配的行。

RIGHT OUTER JOIN(RIGHT JOIN)

RIGHT OUTER JOIN 返回右表的所有记录,以及左表中匹配的记录。左表中不匹配的行将返回 NULL。

下面的查询会返回 departments 表的所有记录,即使没有匹配的员工。

-- Get all departments, even those without employees
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.department_id;

使用 SQL 右外连接合并后的表示例。

使用 SQL 右外连接合并后的表示例。作者供图。

FULL OUTER JOIN

FULL OUTER JOIN 结合了左外连接和右外连接的结果。它会返回两个表的所有记录,在没有匹配的地方以 NULL 填充。

下面的查询会返回 employees 和 departments 表的所有记录,包括不匹配的行。

-- Combine all employees and departments
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
FULL JOIN departments
ON employees.department_id = departments.department_id;

使用 SQL 全外连接合并后的表示例。

使用 SQL 全外连接合并后的表示例。作者供图。

INNER JOIN 与 OUTER JOIN:关键区别

INNER JOIN 与 OUTER JOIN 在合并表时处理不匹配行的方式上有根本区别。理解这些差异有助于在数据库查询中选择正确的连接类型。让我们来比较一下。

INNER JOIN 会返回什么

INNER JOIN 只返回两张表中具有匹配值的行。需要两侧数据都存在时会使用这种连接。

下面的查询从 employees 中检索与 departments 表匹配的记录。

-- Example: Get employees with matching departments
SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
INNER JOIN departments
-- Returns only employees assigned to a department
ON employees.department_id = departments.department_id;

使用 SQL 内连接合并后的表示例。

使用 SQL INNER JOIN 合并后的表示例。作者供图。

OUTER JOIN 会返回什么

OUTER JOIN 会根据其类型,包含来自一个或两个表的不匹配行。例如,LEFT OUTER JOIN 返回左表的所有行以及右表中匹配的行。右表中不匹配的行会以 NULL 填充。

下面的查询检索员工记录,包含那些没有所属部门的员工。

-- Get all employees, even those without a department
SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;

使用 SQL 左外连接检索到的数据示例。

使用 SQL LEFT OUTER JOIN 检索到的数据示例。作者供图。

何时使用 SQL INNER JOIN 与 OUTER JOIN

INNER JOIN 与 OUTER JOIN 在数据检索的实际用例上也有所不同。

何时使用 INNER JOIN

INNER JOIN 最适合在您只需要两张表的交集数据时使用。比如,在分析销售数据以查找已售出的产品时,当产品表与销售表都有匹配记录,就可以使用 INNER JOIN。

何时使用 OUTER JOIN

OUTER JOIN 适用于需要返回完整数据集(包括不匹配行)的时候。例如,生成一个显示所有员工(包含未分配部门的员工)或显示所有部门(包含没有员工的部门)的报告。

总结

理解 INNER JOIN 与 OUTER JOIN 的区别对于编写高效查询至关重要。掌握这些技巧还有助于改进查询优化,以更快地检索数据。建议您持续练习,提升数据库管理技能。

建议您尝试我们的 Associate Data Analyst in SQL 职业路径,成为一名优秀的数据分析师。我们的 Reporting in SQL 课程也将帮助您熟练构建复杂的报表和仪表盘,以高效呈现数据。如果您正在准备包含 SQL 技能展示的面试,建议查看我们的博文 20 Top SQL Joins Interview Questions,助您备考。

Allan Ouko

作者

Allan Ouko

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。

SQL INNER JOIN 与 OUTER JOIN 常见问题

SQL 中的 INNER JOIN 与 OUTER JOIN 有何区别?

INNER JOIN 只返回来自两个表的匹配行,而 OUTER JOIN 会包含不匹配的行;当没有对应数据时,用 NULL 填补空缺。

我应该在何时使用 SQL 的 INNER JOIN?

当您只需要检索两个表中具有匹配值的行时,请使用 INNER JION。

SQL 中的 OUTER JOIN 有哪些类型?

OUTER JOIN 的类型包括 LEFT OUTER JOIN、RIGHT OUTER JOIN 和 FULL OUTER JOIN。

SQL 中 LEFT OUTER JOIN 的工作原理是什么?

左外连接会返回左表的所有行、右表中匹配的行,以及左表中不匹配的行。

什么是 SQL 中的 FULL OUTER JOIN?

FULL OUTER JOIN 会返回两个表的所有行,包括各自不匹配的行。

主题