详解MySQL中的递归查询

MySQL中的递归查询主要通过WITH RECURSIVE语句来实现,这在处理具有层级关系或树形结构的数据时非常有用。下面将通过一个具体的例子来详细解释如何在MySQL中使用递归查询。

示例场景

假设我们有一个部门表(departments),其中包含部门的ID、部门名称以及上级部门的ID(parent_id)。现在,我们想要查询出某个部门及其所有下级部门的名称。

表结构
CREATE TABLE departments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    parent_id INT,
    FOREIGN KEY (parent_id) REFERENCES departments(id)
);
插入数据
INSERT INTO departments (name, parent_id) VALUES ('总公司', NULL);
INSERT INTO departments (name, parent_id) VALUES ('技术部', 1);
INSERT INTO departments (name, parent_id) VALUES ('人事部', 1);
INSERT INTO departments (name, parent_id) VALUES ('前端开发', 2);
INSERT INTO departments (name, parent_id) VALUES ('后端开发', 2);
INSERT INTO departments (name, parent_id) VALUES ('UI设计', 2);

最终表如下图:
在这里插入图片描述

递归查询

现在,如果我们想要查询出“技术部”及其所有下级部门的名称,可以使用以下SQL语句:

WITH RECURSIVE SubDeps AS (
    -- 初始查询,选择顶级部门(技术部)
    SELECT id, name, parent_id
    FROM departments
    WHERE name = '技术部'
    UNION ALL
    -- 递归查询,从当前已知部门中继续查询它们的下级部门
    SELECT d.id, d.name, d.parent_id
    FROM departments d
    INNER JOIN SubDeps sd ON d.parent_id = sd.id
)
SELECT * FROM SubDeps;

查询结果如下图:
在这里插入图片描述

解释
  1. WITH RECURSIVE:这个语句开始了一个递归的公用表表达式(Common Table Expression, CTE)。
  2. SubDeps:这是CTE的名称,在递归查询中我们可以引用它。
  3. 初始查询:首先,我们从departments表中选择出顶级部门(这里是“技术部”)。
  4. UNION ALL:我们使用UNION ALL来合并初始查询的结果和递归查询的结果。UNION ALL允许重复的行,如果确定不会有重复,也可以使用UNION(但在这个例子中,由于我们可能查询出多个层级的相同部门,所以使用UNION ALL)。
  5. 递归查询:在递归查询中,我们从departments表中再次选择数据,但这次我们选择的是那些其parent_id等于CTE中当前行的id的行。这样,我们就能找到所有下级部门。
  6. SELECT * FROM SubDeps:最后,我们从CTE中选择所有结果。
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值