SQL 自连接

2025年8月2日 | 阅读 5 分钟

SQL 中的 SQL JOIN 是用于在两个表之间基于共同列组合行的命令。通过 JOIN,我们可以使用所有表中存在的公共列,通过组合多个表中的行来检索数据。

JOIN 也被称为关系数据库中用于组合表的工具。通过 JOIN,我们可以高效地检索数据。虽然有许多 SQL JOIN,但在本文中我们将讨论 **SELF JOIN**。

SQL 中的 SELF JOIN 是什么?

自连接是一种将表与其自身连接的技术。它是一个常规连接,其中表与其自身连接,表中的每一行都根据用户给出的命令与同一表中的其他行进行比较。通过自连接,我们可以将表与其自身连接,这允许我们比较同一表中的行。当我们需要处理分层数据或需要比较单个表中的行时,它很有用。它有助于查找重复值。

它创建了同一数据的虚拟第二表,可以将其引用为不同的表。

为什么使用 SELF JOIN?

自连接用于从同一表中以某种方式相关的行中获取数据。自连接的一些用例如下:

  • 比较同一表中的行:比较同一表中的行有助于识别数据中的更改、重复项或关系。
  • 查找分层关系:我们使用自连接来查找分层关系。它通过将每个项链接到同一表中的其父项来构建图表或导航树。它显示嵌套连接,并支持数据中关系的可视化分析,例如员工、类别或项目任务。
  • 基于时间的分析:在 SQL 中,基于时间的分析通过比较不同时期的 DATA 来识别更改和模式。通过基于时间的分析,我们可以比较当前值和先前值,这有助于对时间序列数据做出基于信息的决策。
  • 数据血缘:它有助于查找数据在系统之外的来源、移动和转换。它还有助于分析数据的旅程从哪里开始,然后发生了什么,以及数据的去向。它提供了数据流的可见性,并有助于维护对数据过程的信任。

SELF JOIN 的语法

描述

SELECT:这个 SQL 关键字用于从表中选择所需的列。

column_name:这是我们想要检索的列的名称。

FROM:这个关键字用于选择我们想要从中检索列的必需表。

table_name:这是我们想要从中接收数据的表的名称。

JOIN:这是用于连接两个表的关键字。

ON:这是用于给出连接两个表条件的关键字。

common_column:这是表连接的公共列。

在这里,**A** 和 **B** 是同一表的临时名称。它帮助您在单个查询中从单个表中分派两行。

示例

SQL 自连接,用于显示学生及其导师。

步骤 1:创建带有约束的学生表

我们开始 创建名为 Student 的表,该表包含约束以提高数据完整性和结构。

步骤 2:向 Student 表插入数据

步骤 3:从 Student 表接收数据

student_id全名emaildepartment导师 ID注册日期GPA
101Aaron Mitchellaaron.m@college.edu物理1032022-09-013.5
102Bella Turnerbella.t@college.edu化学1032022-09-013.7
103Caleb Hughescaleb.h@college.edu物理1042021-09-013.8
104Diana Fosterdiana.f@college.edu机械工程NULL2020-09-013.9
105Ella Griffinella.g@college.edu机械工程1042022-01-153.6

步骤 4:SQL 自连接以检索学生及其导师

输出

学生姓名学生部门导师姓名导师部门
Aaron Mitchell物理Caleb Hughes物理
Bella Turner化学Caleb Hughes物理
Caleb Hughes物理Diana Foster机械工程
Ella Griffin机械工程Diana Foster机械工程

说明

在上面的示例中,我们展示了如何在 SQL 中使用自连接来连接同一表中的相关人员,例如学生和他们的导师。每个学生都有一个导师,由他们的 ID 列出,我们使用 ID 来显示导师的姓名。学生和导师在同一个表中。我们可以在输出表中看到谁指导谁。

该查询查看每个学生的 mentor_id,并找到具有该 ID 的匹配学生。

注意:所有主要的数据库都支持自连接,但 PostgreSQLOracleSQL Server 在处理层次结构时效果最好。您在使用 MySQL 中的自连接时必须小心,因为自引用外键是模式约束,意味着一行引用同一表中的另一行,因此按正确的顺序插入数据非常重要。

结论

自连接是一种将表中的数据与其他相同表中的数据连接的方法。我们使用了上面的示例来展示哪个学生拥有哪个导师,即使学生和导师都在同一个表中。这有助于我们查看像“谁指导谁”这样的关系,而无需额外的表。

自连接对于多种情况很有用,例如显示经理和员工或类别和子类别。它使在单个表中处理相关信息更加容易,并帮助我们更清楚地理解数据中的连接。