SQL 高级查询

前面我们写了一下 SQL 的极简入门,今天来说点高级查询。没看到的朋友可以点击下面链接查看。
1 小时 SQL 极速入门(一)
1 小时 SQL 极速入门(二)
1 小时 SQL 极速入门(三)

层次化查询

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

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

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

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

那么用 SQL 语句如何进行层次化查询呢?这里就要用到 CONNECT BY 和 START WITH 语法。
我们先把 SQL 写出来,再来解释其中的含义。

SELECTlevel,id,parent_product_id,name
FROMproductSTART WITH id  = 1CONNECT BY prior id = parent_product_id
ORDER BYlevel

查询结果如下:

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

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

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

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

SELECTlevel,id,parent_product_id,LPAD(' ', 2 * (level - 1)) || name AS name
FROMproductSTART WITH id  = 1CONNECT BY prior id = parent_product_id

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

递归查询

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

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

WITHtemp_product (product_level, id, parent_product_id,name) AS(SELECT0 AS product_level,id,parent_product_id,nameFROMproductWHEREparent_product_id IS NULLUNION ALLSELECTtp.product_level + 1,p.id,p.parent_product_id,p.nameFROMproduct pJOIN temp_product tpONp.parent_product_id=tp.id)
SELECTproduct_level,id,parent_product_id,LPAD(' ', 2 * product_level)|| name AS NAME
FROMtemp_product;

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

查询结果如下:

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

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

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

  search depth FIRST BY idSET order_by_id

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

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

  search breadth FIRST BY idSET order_by_id

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

  1. 数据库学习笔记---SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

    SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR) 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:______ ...

  2. mysql 层次化查询_SQL高级查询(层次化查询,递归)

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

  3. SQL基础--层次化查询(START BY ... CONNECT BY PRIOR)

    为什么80%的码农都做不了架构师?>>>    --====================================================== --SQL基础--& ...

  4. (转载)SQL高级查询技巧

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

  5. 【SQL】CONNECT BY 层次化查询

    层次化查询,顾名思义就是把查询结果有层次的呈现出来.层次化查询结果类似于树状结构,最顶端的是"根节点",下面是"父节点",没有子节点的是"叶节点&qu ...

  6. 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询

    目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...

  7. Oracle篇--04 Oracle SQL高级查询、分页查询

    1.子查询 子查询是一条SELECT语句,但它是嵌套在其他SQL语句中的,为的是给该SQL提供数据以支持其执行操作. 查看谁的工资高于CLARK?select ename,sal from emp w ...

  8. MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)

    文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...

  9. mysql查询显示技巧_MYSQL SQL高级查询技巧

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

最新文章

  1. php openssl做什么,php php_openssl.dll文件有什么用?
  2. SAP HUM 内向交货单凭证流和Relationship Browser
  3. 使用 QEMU 进行系统仿真
  4. 怎么检测mysql卸载完全_怎么检查mysql有没有删干净
  5. Python网络编程(OSI模型、网络协议、TCP)
  6. 将bgr彩色矩阵归一化到0-255之间 【RGB image normalization】
  7. (34)FPGA原语设计(BUFGMUX)
  8. PyInstaller编译linux,linux下运行pyinstaller故障解决
  9. linux中 qt安装教程视频,Linux 下QT安装教程
  10. HTML基础代码用法大全,html代码大全(基础使用代码)(颜色代码完整版)
  11. 深度学习与计算机视觉教程(6) | 神经网络训练技巧 (上)(CV通关指南·完结)
  12. CentOS7 网络管理与配置
  13. java如何创建长连接_Java如何实现长连接
  14. Cesium:3dtile制作工具
  15. ubuntu系统Firefox浏览器B站视频无法播放
  16. MD5加密和SHA256加密
  17. 考研英语复习五大计划表
  18. Android开发工具系列 --Hosts映射
  19. 什么是网络环路问题?
  20. Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览

热门文章

  1. 强化学习之gym初战实战案例:悬崖案例CliffWalking-v0。
  2. 未来已来:全球XR产业洞察
  3. 希尔伯特著名的第六问题 – 原来麦克斯韦早就有解?
  4. 10件5G能实现但4G不能做的事情
  5. 2019上海车展展后报告(整车篇)
  6. 有没有哪些数学猜想是验证到很大的数以后才发现是错的?
  7. AI产业投融资情况回顾、中美科技巨头AI产业投资布局以及领先投资机构AI产业投资布局...
  8. 人工智能名人堂第54期 | 深度学习鼻祖:Geoffrey Hinton
  9. 一文详解脑科学研究与产业发展方向
  10. 学到了!程序员大神用这招让开发效率直接提升 10 倍!!