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表中使用它来检索分层数据或执行递归查询。