内连接与外连接

2024年8月28日 | 阅读 4 分钟

引言

SQL(结构化查询语言)对于在关系数据库中提取和修改数据至关重要。在处理需要根据特定标准整合数据的多个表时,经常会出现这种情况。SQL JOIN 在这种情况下非常有用,因为它们允许用户合并来自多个表的数据。在众多 SQL JOIN 类型中,内连接和外连接是最基本的两种。

Inner Join

使用内连接,根据预定的标准(通常是包含一个共享列)从两个表中选择记录。通过仅保留满足连接要求的行,可以过滤掉两个表中不匹配的数据。

以 Departments(部门)和 Employees(员工)表为例。前者包含员工信息,包括姓名和部门 ID,而后者包含部门信息,包括名称和 ID。通过在 Employees 和 Departments 表上使用共享列 DepartmentID 执行内连接,可以获得仅包含与活动部门关联的员工的数据集。当精确的数据对齐至关重要时,内连接性能最佳。它通过仅保留匹配的记录,从而实现有针对性的分析和高效的数据处理。

示例:内连接

考虑两个表:Employees 和 Departments。

Employees 表

ID名称DepartmentID
1John101
2Alice102
3Bob101
4Sarah103

Departments 表

DepartmentIDDepartmentName
101销售
102营销
104HR

查询

输出

ID名称DepartmentName
1John销售
2Alice营销
3Bob销售

Outer Join

与内连接的筛选特性不同,外连接则拥抱多样性,并确保没有数据丢失。它有三种不同的类型:全外连接、右外连接和左外连接。每种类型都具有不同程度的数据合并全面性,满足不同的需求。

左外连接:在左外连接中,即使右表中没有匹配的条目,左表(连接中提到的第一个表)中的所有记录都会被保留。在结果数据集中,NULL 值将添加到右表中未匹配的条目。

右外连接:另一方面,右外连接会在保留右表的所有记录并合并左表的匹配数据时,为不匹配的记录填充 NULL 值。

全外连接:这是三种连接中最全面的。全外连接合并来自两个表的信息,包括所有记录,无论它们是否匹配。为了保持数据完整性,匹配的项会在存在时对齐;否则,会引入 NULL 值。

设想这样一种情况:一家公司的 HR 部门想要创建一个所有部门及其员工的完整名册,包括匹配和不匹配的条目。通过使用全外连接,您可以全面地查看组织结构,并确保每个部门或每个人都能被注意到。

示例:外连接

考察前面提到的相同的 Employees 和 Departments 表。

假设您希望获得一份所有员工的列表,而不考虑他们是否分配了部门。为了实现这一点,将使用左外连接,以确保所有员工都被保留,即使在他们没有对应部门的情况下。

查询

输出

ID名称DepartmentName
1John销售
2Alice营销
3Bob销售
4SarahNULL

内连接与外连接的区别

方面Inner JoinOuter Join
包含性(Inclusivity)仅从两个表中选择匹配的记录。保留所有记录——包括至少一个表中带有 NULL 值的非匹配记录。
结果内容仅包含满足连接要求的记录。根据外连接的类型,包含来自一个或两个表的非匹配记录。
用例理想情况:在不需要非匹配记录时,用于精确的数据对齐。理想情况:在需要全面数据汇总时,允许非匹配条目的情况。
类型一种连接类型。包含左连接、右连接和全外连接的变体,提供不同程度的包含性。
处理 NULL 值不会向结果集中添加 NULL 值。对于没有匹配记录的表字段,会引入 NULL 值。
数据完整性如果存在大量非匹配记录,这可能会导致洞察不足。即使在记录不匹配的情况下,也能确保不丢失任何信息并保持数据完整性。

结论

在不断发展的数据分析和管理领域,SQL JOIN 是至关重要的工具,它们能够整合不同的数据集。尽管内连接和外连接的方法和包含程度不同,但它们对于数据整合过程都同样重要。外连接拥抱包容性,允许非匹配的条目提供全面的数据汇总,而内连接则通过保留匹配的记录来实现精确性。SQL 用户通过明智地利用各种连接类型(根据具体需求),可以释放他们数据的全部潜力,并在广泛的领域中激发洞察和创造力。