SQL 高级查询

层次化查询

层次化结构可以理解为树状数据结构,由节点构成。比如常见的组织结构由一个总经理,多个副总经理,多个部门部长组成。再比如在生产制造中一件产品会有多个子零件组成。举个简单的例子,如下图所示

汽车作为根节点,下面包含发动机和车身两个子节点,而子节点又是由其他叶节点构成。(叶节点表示没有子节点的节点)

假如我们要把这些产品信息存储到数据库中,会形成如下数据表。

我们用 parent_product_id 列表示当前产品的父产品是哪一个。

那么用 SQL 语句如何进行层次化查询呢?这里就要用到 CONNECT BY 和 START WITH 语法。

我们先把 SQL 写出来,再来解释其中的含义。

SELECT

level,

id,

parent_product_id,

name

FROM

product

START WITH id = 1

CONNECT BY prior id = parent_product_id

ORDER BY

level

查询结果如下:

解释一下:LEVEL 列表示当前产品属于第几层级。START WITH 表示从哪一个产品开始查询,CONNECT BY PRIOR 表示父节点与子节点的关系,每一个产品的 ID 指向一个父产品。

如果我们把 START WITH 的查询起点改为 id = 2,重新运行上面的 SQL 语句将会得到如下结果:

因为 id=2 的产品是车身,我们就只能查到车身下面的子产品。

当然,我们可以把查询结果美化一下,使其更有层次感,我们让根节点下面的 LEVEL 前面加几个空格即可。把上面的 SQL 稍微修改一下。为每个 LEVEL 前面增加 2*(LEVEL-1)个空格,这样第二层就会增加两个空格,第三层会增加四个空格。

SELECT

level,

id,

parent_product_id,

LPAD(' ', 2 * (level - 1)) || name AS name

FROM

product

START WITH id = 1

CONNECT BY prior id = parent_product_id

查询结果已经有了层次感,如下图:

递归查询

除了使用上面我们说的方法,还可以使用递归查询得到同样的结果。递归会用到 WITH 语句。普通的 WITH 语句可以看作一个子查询,我们在 WITH 外部可以直接使用这个子查询的内容。

当递归查询时,我们是在 WITH 语句内部来引用这个子查询。还是上面的例子,我们使用 WITH 语句来查询。

WITH

temp_product (product_level, id, parent_product_id,name) AS

(

SELECT

0 AS product_level,id,parent_product_id,name

FROM

product

WHERE

parent_product_id IS NULL

UNION ALL

SELECT

tp.product_level + 1,p.id,

p.parent_product_id,

p.name

FROM

product p

JOIN temp_product tp

ON

p.parent_product_id=tp.id

)

SELECT

product_level,

id,

parent_product_id,

LPAD(' ', 2 * product_level)

|| name AS NAME

FROM

temp_product;

第一条 SELECT 语句我们查询出来了根节点,并且设置为 level = 0,第二条SELECT 语句关联上 WITH 语句自身,并且 level 每层加 1 进行递归。

查询结果如下:

可以看到第一列是展示的产品层级,和我们上面查询出来的结果是一致的。

同时使用 WITH 递归时还可以使用深度优先搜索和广度优先搜索,什么意思呢?广度优先就是在返回子行之前首先返回兄弟行,如上图,首先把车身和发动机两个兄弟行返回,之后是他们下面的子行。相反,深度优先就是首先返回一个父节点的子行再返回另一个兄弟行。

我们只需要在 SELECT 语句上方加上下面语句即可实现深度优先搜索查询。

search depth FIRST BY id

SET order_by_id

结果如下,看到首先返回每个父节点下的子行,再返回另一个父节点。

同理,广度优先使用的是下面的 SQL 语句

search breadth FIRST BY id

SET order_by_id

mysql 层次化查询_SQL高级查询(层次化查询,递归)相关推荐

  1. java高级查询_SQL高级查询(转载)

    transact---sql高级查询(下) 5:使用having关键字来筛选结果 6:使用compute和compute by子句 7:使用嵌套查询 8:分布式查询 E:使用having关键字来筛选结 ...

  2. mysql两者之间_sql between 语法与查询两者之间数据方法

    BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这 些值可以是数值.文本或者日期. SQL BETWEEN 语法 SELECT FROM WHERE ( ...

  3. mysql经典四表查询_sql 经典四表查询

    题 目 : student(sid, sname, sage, ssex) -- 学生信息表(学生编号 自增,学生姓名, 学生出生年月, 性别): teacher(tid, tname) -- 教师信 ...

  4. mysql按专业人数升序查询_sql 语句排序 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列?...

    代码如下: select xuehao as 学号,score as 总成绩 from CJBwhere xuehao in( select xuehao from XSB) group by xue ...

  5. sql镶嵌查询_sql数据库的嵌套查询

    实验四:数据库的嵌套查询实验 学号: 姓名: 实验四:数据库的嵌套查询实验 实验目的: 加深对嵌套查询语句的理解. 实验内容: 使用 IN . 比较符. ANY 或 ALL 和 EXISTS 操作符进 ...

  6. mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询

    最近有个需求,要修改现有存储结构,涉及查询条件和查询效率的考量,看了几篇索引和HBase相关的文章,回忆了相关知识,结合项目需求,说说自己的理解和总结. 总体目录如下,上篇介绍了前3小节,分析了索引为 ...

  7. mysql 最值复杂查询_MySQL高级查询

    我们使用SQL查询不能只使用很简单.最基础的SELECT语句查询.如果想从多个表查询比较复杂的信息,就会使用高级查询实现.常见的高级查询包括多表连接查询.内连接查询.外连接查询与组合查询等,今天我们先 ...

  8. 【MySQL】数据库的高级查询

    前言 上次我们讲了数据库的基本查询,这次继续接上来数据库的高级查询.高级查询是建立在基础查询的基础上面的,如果你还没有看过建议你先去学习数据库的基础查询. 传送门:MySQL数据库的基本查询 数据库的 ...

  9. Mysql高级-应用优化,查询缓存优化,锁

    文章目录 1. 应用优化 1.1 使用连接池 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL复制分流查询 ...

最新文章

  1. 系统怎么手动打补丁_韩国服务器不稳定怎么办?
  2. python代码计算图像的分辨率
  3. 仿抖音底部导航效果(一)
  4. 编译MiniGUI 程序
  5. 2018-06-29 西游记主题Python入门示例尝试-数据结构 5.1-5.1.2
  6. js(Dom+Bom)第二天(1)
  7. 移动端相关 em rem px 区别和关联
  8. Storm Player 字幕加载
  9. Arcgis使用教程(八)地图文档(.Mxd)的使用方法详解
  10. C语言学习-翁凯(第三章笔记)
  11. 腾讯前辈熬夜肝了一个月整理的《Linux内核学习笔记》,啃完受益匪浅不走弯路
  12. PHP如何接入短信接口,通过短信群发通知
  13. [Irving]SqlServer 拆分函数用法
  14. 影视小程序详细搭建教学(非微擎)
  15. 一个呼叫中心系统应该怎样搭建?okcc呼叫系统
  16. 归一化函数normalize
  17. 香港服务器 微信支付,如何给微信开通香港钱包(WeChat Pay HK)
  18. iOS客户端实现 XMPP协议的步骤
  19. 矩阵合同与相似,为什么只有当C为正交阵时才能使既相似又合同?
  20. 多目标优化(智能算法)

热门文章

  1. 00-为什么要做骑象人--解锁Hadoop高薪之路
  2. mysql kettle_带你躲过mysql与kettle闹离婚的坑,开发不迷茫
  3. iOS开发:UIImage 图片处理:截图,缩放,设定大小,存储
  4. 【making tools】:算英语文章中单词个数,给英语老师使用
  5. 二维码工具-QrCodeUtil
  6. 如何通过病毒营销打造爆款产品
  7. Node.js.不要堵塞线程(一)
  8. Detail information about Withholding Tax in SAP
  9. ubuntu 8.04.2
  10. VS2015+WDK10在不同环境下的驱动配置