-- Inner Join: Returns only matching rows from both tablesSELECT o.OrderID, c.CustomerName
FROM Orders o
INNERJOIN Customers c ON o.CustomerID = c.CustomerID;技术支持
-- Left Outer Join: Returns all rows from Customers and matching rows from OrdersSELECT c.CustomerName, o.OrderID
FROM Customers c
LEFTJOIN Orders o ON c.CustomerID = o.CustomerID;技术支持
-- Example: Get employees with matching departmentsSELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
INNERJOIN departments
-- Returns only employees assigned to a departmentON employees.department_id = departments.department_id;技术支持
使用 SQL INNER JOIN 合并后的表示例。作者供图。
OUTER JOIN 的工作原理
OUTER JOIN 会根据所用类型,包含来自一个或两个表的不匹配行。
LEFT OUTER JOIN(LEFT JOIN)
LEFT OUTER JOIN 返回左表的所有记录,以及右表中匹配的记录。若无匹配,右表的列将返回 NULL。
-- Get all employees, even those without a departmentSELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
LEFTJOIN departments
ON employees.department_id = departments.department_id;技术支持
RIGHT OUTER JOIN 返回右表的所有记录,以及左表中匹配的记录。左表中不匹配的行将返回 NULL。
下面的查询会返回 departments 表的所有记录,即使没有匹配的员工。
-- Get all departments, even those without employeesSELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
RIGHTJOIN departments
ON employees.department_id = departments.department_id;技术支持
使用 SQL 右外连接合并后的表示例。作者供图。
FULL OUTER JOIN
FULL OUTER JOIN 结合了左外连接和右外连接的结果。它会返回两个表的所有记录,在没有匹配的地方以 NULL 填充。
下面的查询会返回 employees 和 departments 表的所有记录,包括不匹配的行。
-- Combine all employees and departmentsSELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
FULLJOIN departments
ON employees.department_id = departments.department_id;技术支持
-- Example: Get employees with matching departmentsSELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
INNERJOIN departments
-- Returns only employees assigned to a departmentON employees.department_id = departments.department_id;技术支持
-- Get all employees, even those without a departmentSELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
LEFTJOIN departments
ON employees.department_id = departments.department_id;技术支持
在本教程中,我将解释 SQL
INNER JOIN与OUTER JOIN的区别,并配以示例。读完之后,您可能还想学习我们的Joining Data in SQL 课程,涵盖其他有趣的连接类型,如SELF JOIN和CROSS JOIN,以及更宏观的概念,比如集合论。快速答案
INNER JOIN会基于共有列仅返回表间匹配的行,排除不匹配的行。比如,下面的查询只有在存在匹配时才显示带有客户详情的订单。OUTER JOIN会包含匹配行以及来自一个或两个表的不匹配行。下面的查询返回所有客户,包括那些没有订单的客户。深入了解 SQL 的 INNER JOIN 与 OUTER JOIN
下面我们分别更仔细地看看 SQL 的
INNER JOIN和OUTER JOIN。在讲解过程中,请参考以下两张表:员工表示例。作者供图。
部门表示例。作者供图。
INNER JOIN 的工作原理
INNER JOIN仅根据指定条件检索两张表中都有匹配的行。以下查询选择
employee_id、demployee_name、department_name和salary,并仅返回存在department_id的行。使用 SQL INNER JOIN 合并后的表示例。作者供图。
OUTER JOIN 的工作原理
OUTER JOIN会根据所用类型,包含来自一个或两个表的不匹配行。LEFT OUTER JOIN(LEFT JOIN)
LEFT OUTER JOIN返回左表的所有记录,以及右表中匹配的记录。若无匹配,右表的列将返回NULL。下面的示例会检索
employees表中的所有记录,即使存在不匹配的情况。员工缺失的department_name将以NULL返回。使用 SQL 左外连接合并后的表示例。作者供图。
LEFT JOIN 与 LEFT OUTER JOIN 在 SQL 中可互换使用,因为这两种查询都会获取左表的所有行以及右表中匹配的行。
RIGHT OUTER JOIN(RIGHT JOIN)
RIGHT OUTER JOIN返回右表的所有记录,以及左表中匹配的记录。左表中不匹配的行将返回NULL。下面的查询会返回
departments表的所有记录,即使没有匹配的员工。使用 SQL 右外连接合并后的表示例。作者供图。
FULL OUTER JOIN
FULL OUTER JOIN结合了左外连接和右外连接的结果。它会返回两个表的所有记录,在没有匹配的地方以NULL填充。下面的查询会返回
employees和departments表的所有记录,包括不匹配的行。使用 SQL 全外连接合并后的表示例。作者供图。
INNER JOIN 与 OUTER JOIN:关键区别
INNER JOIN与OUTER JOIN在合并表时处理不匹配行的方式上有根本区别。理解这些差异有助于在数据库查询中选择正确的连接类型。让我们来比较一下。INNER JOIN 会返回什么
INNER JOIN只返回两张表中具有匹配值的行。需要两侧数据都存在时会使用这种连接。下面的查询从
employees中检索与departments表匹配的记录。使用 SQL INNER JOIN 合并后的表示例。作者供图。
OUTER JOIN 会返回什么
OUTER JOIN会根据其类型,包含来自一个或两个表的不匹配行。例如,LEFT OUTER JOIN返回左表的所有行以及右表中匹配的行。右表中不匹配的行会以 NULL 填充。下面的查询检索员工记录,包含那些没有所属部门的员工。
使用 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,助您备考。