SQL自

关系数据库最著名的特性之一是连接。连接是关系数据库最强大、最复杂的特性之一。它们允许广泛的模块化和数据库表之间非常复杂的关系,而不会影响性能。

然而,SQL中有一种连接往往不被注意,它被称为自连接。

在SQL中,自连接是一种强大的技术,它允许我们基于同一表中的相关列组合来自同一表的行。

与SQL中其他类型的连接(从多个表中获取数据)不同,自连接在单个表上工作。

您可能会问,既然可以从表本身查找数据,为什么还需要自连接呢?虽然这可能是真的,但是当您需要执行递归数据查询或查找分层数据时,自连接可以提供帮助。

本质上,在需要比较同一表的行时,自连接起着基本的作用。

在这篇文章中,我们将探索自连接是什么,它们是如何工作的,以及如何在SQL表中使用它们。

注意:在深入研究之前,我们将设置一个基本表以进行演示。但是,您可以使用任何受支持的数据集。

样本数据

下面的查询创建了一个包含产品信息的基本表,并将样例记录插入表中。这使我们能够演示如何在SQL中使用自连接。

创建表产品

product_id INT主键,

product_name VARCHAR(255) NOT NULL,

parent_id INT

);

向表中添加10条样例记录。

INSERT INTO Products (product_id, product_name, parent_id) VALUES

(1, 'Electronics', NULL),

(2,“智能手机”,1)

(3,“笔记本电脑”,1),

(4,“iPhone 13”,2);

(5,“三星Galaxy S21”,2);

(6,“MacBook Pro”,3);

(7, '戴尔XPS 15', 3),

(8)“附件”,NULL);

(9,“手机壳”,8),

(10,“手提电脑包”,8);

结果表如下:

示例1:基本自连接

让我们从一个基本的自连接开始。例如,我们可以使用一个简单的自连接来检索同一表的父子关系。

例如,我们可以使用它来查找所有产品及其对应的父产品。我们可以运行如下查询:

选择c.p product_name为child_product, p.p product_name为parent_product

产品c

LEFT JOIN Products p ON c.p parent_id = p.p product_id;

在给定的示例查询中,我们使用“c”作为表示子产品的产品表的别名。

我们还为产品表创建了“p”别名,以表示父产品。

在下一步中,我们使用一个基本的SQL LEFT JOIN来确保顶级产品包含在结果中。

最后,我们使用ON子句使用“parent_id”和“product_id”列创建子记录和父记录之间的关系。

结果表如下:

您将注意到,父产品没有顶部链接,因为它们位于层次结构的顶部,也称为根元素。

例2:获取分层数据

自连接最基本的角色之一是检索分层数据。例如,假设我们想要检索产品等于“Accessories”的所有儿童产品。我们可以使用自连接运行查询,如下所示:

选择c.product_name作为child_product

产品c

JOIN Products p ON c.p parent_id = p.p product_id

WHERE p.p product_name = 'Accessories';

在本例中,我们使用JOIN将products表与其本身结合起来,然后使用WHERE子句过滤出我们想要的结果。

结论

在本教程中,我们探讨了自连接是什么,它是如何工作的,以及如何在SQL表中使用它来检索分层数据或执行递归查询。