大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

在之前的的系列文章中,有意思的SQL(3) 行转列,列转行和复制

已经给大家介绍了,行转列,列转行,复制等方法。

在这篇文章中,对其进行更深一层的应用。

需求如下,

有一个表如下图所示

现在有个需求是,我在画面输入

'10004,22744,24007' 要求返回对应的三行数据

当然有很多种解决方案,一类是,在前端或者server端 用语言把输入值分开,

还有一种是在数据库端,本文介绍的是在数据库端的方法,

当然还有 最简单方案如下

这种方案,也可以解决输入值有空格的情况

那这种方案的问题在哪呢?

先看下,这个表中是有索引的如下

运行了,下面的SQL 从执行计划中,可看出,走全表扫描了

也就是说表越大,有可能越慢!

写SQL 有几个阶段,第一个阶段是为了熟悉各种语法,和实现各种需求阶段

第二个阶段是,写出,更符合数据库特点,符合优化思路的SQL

上面的SQL 就是满足了需求,但是不符合优化。

如果写成如下

就可以有能满足需求,有能达到优化效果的SQL!

那现在的问题是,怎么把 '10004','22744','24007' 一行数据的变成3行数据的问题!

这样总算,文章又回到,本文开篇,没跑题~~

根据上篇文章,我们想把一行数据变成多行,我们需要复制

这里我用到了MySQL 8.0 开始支持的with 语句,

不支持的可以用临时表代替。

其中 num 是为了复制而弄的中间表,可以理解为,我们中学的几何题中,为了解决问题画的辅助线~~。

上面的SQL 已经达到复制效果了,但是显然,复制的有点多了,我们只需要3行数据,但复制了5行,显然不行,我们观察下,结果发现我们如果复制的行数是逗号的个数+1 就可以了!

那怎么表达呢,我们用原来的length-去掉逗号后length +1 就可以

从上图所示,可以看出,这样就复制了我们想要的行数。

现在就剩下,怎么截取的问题,我们想要的是第一行截取第一个,第二行第二个,第n行第n个 。。。

MySQL 8.0给我们提供了regexp_substr这样的强大的函数,专门解决这样的问题

当然还有别的解决方案,为了代码的简单,我就用了这个函数

这样我们就解决了,行转列的问题,剩下的是把这部分带到原来的SQL 中,

执行计划如下,执行计划稍微有点复杂,初学者比较难懂

下面是运行结果,还是符合需求的

为了,给大家一个直观的感觉,我用大表salaries 表替换了原来的dept_emp表

然后运行SQL如下 运行了3.8 秒 !

用修改之后代码 行数太多,我把数据删了保留时间如下 0.01秒

用倍数的话。。。

本文,通过一个简单案例,给大家讲述了,SQL开发过程中的几个方法和优化思路,我们不仅仅开发过程中想到怎么解决需求,若果想进一步,就需要考虑性能问题

谢谢大家~

我是知数堂SQL 优化班老师~ ^^

如有关于SQL优化方面疑问和一起交流的请加 并且 @兔子@知数堂SQL优化

mysql 复杂行转列_有趣的SQL(4) 行转列的复杂应用和优化思想相关推荐

  1. mysql 复杂行转列_有趣的SQL(四) 行转列的复杂应用和优化思想

    原标题:有趣的SQL(四) 行转列的复杂应用和优化思想 导读 本文节选自松华老师<SQL优化专栏> 大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章:有趣的SQL ...

  2. mysql bitand函数_有趣的SQL(一)

    原标题:有趣的SQL(一) 大家都想提高自己的SQL能力,但是SQL能力也是需要慢慢提高的,为了让大家的SQL有所提高,特整理了下面的SQL. 需求:如下所示,有从1开始的2的幂的数组 - - 1, ...

  3. mysql实验6语言结构_实验六 SQL语言数据查询语言DQL.pdf

    实验六 SQL语言数据查询语言DQL 实验六 SQL 语言数据查询语言DQL 一.实验目的 数据查询语言指对数据库中的数据查询.统计.分组.排序等操作.查询语 句可以分为简单查询.连接查询.嵌套查询和 ...

  4. mysql 左外连接原理_深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接...

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和 ...

  5. python行数据切片_通过切片访问DataFrame行

    购买本课程所在专题<Python数据分析师:0基础到数据分析达人>https://edu.51cto.com/topic/2570.html,赠送一本"Python相关图书&qu ...

  6. sqlserver中将多列_如何在Excel中将一个长列变成多个列

    sqlserver中将多列 Too much data in a single column can make your Microsoft Excel spreadsheet harder to r ...

  7. sql 如何设置行级锁_如何使用SQL Server 2016行级安全性过滤和阻止数据访问

    sql 如何设置行级锁 SQL Server 2016 came with many new features and enhancements for existing ones, that con ...

  8. sql两个列值以下划线拼接得到一个新的列_面试必备sql知识点——MySQL基础

    在刷了上百道sql题后,发现所有的题目都是基于某一个或几个知识点来做考察的,所以理清基础的知识细节,才能在题目考察到任意知识点时,找到解决线索. 温故而知新,学习在于总结,于是我再次对已经学习过的my ...

  9. python excel增加一列_(用Python修改excel中一列数据)python新增一列

    python怎么从excel中读取数据? ⒈ #import παέτο import xlrd #Ρύθμι διαδρής path='C:\\Users\\jyjh\\Desktop\\data ...

最新文章

  1. Spring Cloud 微服务实战笔记
  2. 【算法】弗洛伊德(Floyd)算法
  3. eclipse egit提交方法
  4. 软件架构自学笔记--大学学的软件工程为什么感觉很“虚”
  5. 原码、补码、反码、1的补码
  6. 机器学习-关联之Apriori算法原理及实战
  7. Orion Network Performance Monitor 软件在网络管理中的应用
  8. 两平面平行方向向量关系_一文读懂 GDT 中的平面度
  9. php 显示下拉菜单,PHP在下拉列表中显示菜单树
  10. Ubuntu18.04 + CUDA10.0 + tensorflow-gpu 安装过程
  11. mybatis 插入一条记录 参数为map的写法【用遍历Map的key和value的方式,可以实现只插入有效值】...
  12. JUnit4单元测试入门教程
  13. 复杂性应对之道 - 领域建模
  14. as模拟器配置编译的Android,android studio连接雷电模拟器 【AS 模拟器】
  15. Windows10 操作系统里数量众多的 svchost.exe
  16. 人工智能 行为主义 综述
  17. 做软件开发,客户难找?接单难?怎么办?
  18. Win10 使用黑屏重置键 解决 黑屏问题
  19. 全卷积神经网络(FCN)
  20. 程序员的工资高,到底程序员的工资有多高?你不了解的程序员!

热门文章

  1. i7 7700hq和i5 10300h哪个好
  2. 修改以太网卡IP.bat
  3. OSChina 周一乱弹 —— 最励志演讲
  4. oracle_OEM与常见故障处理
  5. 文心ERNIE源码学习与实践:为超越ChatGPT打下技术基础!
  6. IntelliJ IDEA IDEtalk
  7. asp租用和saas租用_租用专用游戏服务器
  8. Zynq UltraScale系列使用MIPI CSI-2 RX Subsystem 解码MIPI视频PD输出 提供2套工程源码和技术支持
  9. GO语言————8.6 将 map 的键值对调
  10. 苹果x处理器多少_苹果16英寸MacBook Pro笔记本相比前代产品有什么变化?