暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL面试题:如何使用 SQL 在数据库中存储和查询分层数据?

原创 小小亮 2022-12-14
909

您使用什么方法来检测分层数据并进行查询?我们即将获得两个流行的 SQL 查询的答案。在使用 SQL 和关系数据库时,查询分层数据是一种典型的情况。这并不是说分层数据很神秘或不常见。相反,它就在我们身边。那么,为什么分层数据很难在关系数据库中工作?问题主要出现在将分层数据转换为关系数据库概念时。

处理分层数据的第一步是识别它。我将首先定义分层数据并提供日常生活中的一些实例。之后,我将介绍分层数据通常如何存储在数据库中。

首先,让我们谈谈数据。

什么是分层数据?

分层数据是一种数据类型,其中数据集按分层顺序组织。当您想到层次结构时,会想到什么?可能在不同的层次上:某物高于、低于或等于另一物。父子连接在关系数据库中也称为层次关系。这表明孩子数据只有一个父母,而父母数据有一个或多个“孩子”。

通常将分层数据描述为具有树状结构。当我们查看一些常见的分层数据示例时,您就会明白原因。

分层数据的示例

员工层次结构是描述层次结构数据的常见示例。像这样的组织结构图用于描述它们:

图片.png

如您所见,该结构顶部较薄,向下变宽,类似于松树。

营销总监托马斯·爱迪生位居榜首,他下面有 3 位经理。如上图所示,这三位经理是玛丽·居里、布莱斯·帕斯卡和艾萨克·牛顿。居里夫人手下还有另外两位经理威尔汤姆森和卡尔高斯。Blaise Pascal有1名,Isaac newton手下有2名经理。他们每个人手下都有几个员工。

如果你们愿意,有无数个以分层方式表示的数据示例。

很少有家谱、电脑文件夹等。

在数据库中存储分层数据

当您尝试在数据库中存储分层数据时,您经常会遇到问题。为此,您需要将所有多级数据打包到一个表中,这是一个相当扁平的结构。将分层数据转换为基本行的最佳方法是什么?

在大多数数据库中,引用同一个表的列用于保存分层数据。这到底意味着什么?我想我给你举个例子会更好。就业结构似乎对此很理想!

让我们创建一个名为 employees 的表并在其中插入一些数据。

CREATE TABLE employee
(
  id INT PRIMARY KEY,
  name VARCHAR(101) NOT NULL,
  superior_id INT
);

现在,让我们重新创建我们之前看到的图表。让我们插入类似的数据。

INSERT INTO employee VALUES
    (1, 'will thompson', 6),
    (2, 'carl gauss', 6),
    (3, 'james watt', 7),
    (4, 'maxwell clark', 8),
    (5, 'paul dirac', 8),
    (6, 'marie curie', 9),
    (7, 'blais pascal', 9),
    (8, 'Isaac Newton', 9),
    (9, 'Thomas Edison', null);

数据库中的表格如下所示:

图片.png

在数据库中,分层数据通常包含与同一个表相关的列。这是一个很好的例子。您需要编写此查询来检索表员工的直属下属。

SELECT sub.id as subordinate_id,
	sub.name as subordinate_name,
    sup.id as superior_id,
    sup.name as superior_name
FROM employee sub JOIN employee sup
ON sub.superior_id = sup.id
ORDER BY superior_id;

上述查询的结果如下所示:

图片.png

employee 表在此查询中连接到自身。请允许我解释一下它是如何工作的。将表连接到自身时必须使用显式别名,以便 SQL 知道哪些数据来自哪个表——并且您知道哪些数据来自哪个表。

上面查询中的一个表别名是 sub。这表明这是包含下属数据的表。另一个别名是 sup,它指的是包含上级数据的表。尽管这是同一张表,但我们将其视为两个单独的表来处理。

总结

我在上面的例子中教过你如何发现直接上级/下属。这意味着你已经掌握了只看到高于或低于一级的能力。虽然这是非常有益的,但层次结构可能非常复杂并且包含大量级别。在搜索此类数据之前,您需要了解如何使用递归查询。但是,这篇文章还不够。我们将在接下来的文章中讨论它。

原文标题:How to store and Query Hierarchical Data in Database using SQL? Example Tutorial
原文链接:https://www.sqlrevisited.com/2022/02/how-to-store-and-query-hierarchical.html

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论