概述

MySql 8新增了CTE(公共表达式)和窗口函数功能,这两个极大的简化了我们复杂查询的写法特别是一些分析类查询的写法。这两个函数极大的提高了我们复杂SQL可读性,使我们的代码后期更易于维护。熟悉数据库的同学,对Count(),Sum(),Max/Min等基本统计函数并不陌生。普通统计函数在每个分组内只能返回一条记录。而新增加的窗口函数和CTE函数可以一个分组返回多条函数。下面我们通过具体的例子来演示这两种函数的具体用法

窗口函数

例1:

. 有一张表结构如下

mysql> desc mytest;

+--------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+--------+---------------+------+-----+---------+-------+

| id | int(11) | YES | | NULL | |

| name | text | YES | | NULL | |

| course | text | YES | | NULL | |

| score | decimal(10,0) | YES | | NULL | |

+--------+---------------+------+-----+---------+-------+

id是学号

name是学生姓名

course是学科名称

score是成绩

. 它有以下数据:

mysql> select * from mytest;

+------+------+----------+-------+

| id | name | course | score |

+------+------+----------+-------+

| 1 | TOM | Math | 100 |

| 2 | TOM | Letter | 90 |

| 3 | TOM | English | 80 |

| 4 | TOM | Physical | 100 |

| 5 | TOM | Chemical | 99 |

| 6 | CICI | Math | 90 |

| 7 | CICI | Letter | 100 |

| 8 | CICI | English | 80 |

| 9 | CICI | Physical | 90 |

| 10 | CICI | Chemical | 70 |

| 11 | CoCo | Math | 90 |

| 12 | CoCo | Letter | 92 |

| 13 | CoCo | English | 93 |

| 14 | CoCo | Physical | 94 |

| 15 | CoCo | Chemical | 95 |

+------+------+----------+-------+

15 rows in set (0.00 sec)

问题1:要查询出每一科最高分学生的学号,姓名,成绩和科目。在MySQL8之前主要是通过下面的方式来实现。

答案1:MySql 8之前的方法

mysql>select x.id,x.name,x.course,x.score

from ( select t.*,if(@_course=t.course ,@rn:=@rn+1,@rn:=1) as rn ,@_course:=t.course as _course

from

(select t.* from mytest t order by course,score desc ) t ,

(select @rn:=0 rn ,@_course:='') b

)x

WHERE rn=1 ORDER BY course;

+------+------+----------+-------+

| id | name | course | score |

+------+------+----------+-------+

| 5 | TOM | Chemical | 99 |

| 13 | CoCo | English | 93 |

| 7 | CICI | Letter | 100 |

| 1 | TOM | Math | 100 |

| 4 | TOM | Physical | 100 |

+------+------+----------+-------+

5 rows in set, 5 warnings (0.00 sec)

这个sql虽然高效,但是可读性不强。接下来我们来看看窗口函数怎么实现

答案2:使用窗口函数ROW_NUMBER

mysql> select id,name,course,score

from (

select

row_number()over(partition by course order by score desc) as rn,

id,

name,

course,

score

from mytest

)t where rn=1;

+------+------+----------+-------+

| id | name | course | score |

+------+------+----------+-------+

| 5 | TOM | Chemical | 99 |

| 13 | CoCo | English | 93 |

| 7 | CICI | Letter | 100 |

| 1 | TOM | Math | 100 |

| 4 | TOM | Physical | 100 |

+------+------+----------+-------+

答案3 使用CTE方式

mysql> with cte as(

select row_number()over(partition by course order by score desc) as rn, id,name,course,score from mytest

)

select id,name,course,score from cte where rn = 1;

+------+------+----------+-------+

| id | name | course | score |

+------+------+----------+-------+

| 5 | TOM | Chemical | 99 |

| 13 | CoCo | English | 93 |

| 7 | CICI | Letter | 100 |

| 1 | TOM | Math | 100 |

| 4 | TOM | Physical | 100 |

+------+------+----------+-------+

5 rows in set (0.00 sec)

通过对比上面的三种答案,发现CTE和窗口函数极大简化了我们的sql语句。我们的sql更容易读懂。

结论:

本文通过一个简单的例子介绍了MySQL新增的CTE和窗口函数来简化我们SQL开发的难度。关于具体的CTE和窗口函数的具体语法请查阅Mysql的官方文档。

mysql8.0 with cte查询_MySQL · 最佳实践 · 8.0 CTE和窗口函数的用法相关推荐

  1. AIX 6.1 安装 Oracle 11.2.0.4 ASM RAC PSU 最佳实践

    AIX 6.1 安装 Oracle 11.2.0.4 ASM RAC PSU 最佳实践 近期自己在AIX 6.1平台上安装过多次RAC,碰到过各种坑,究其原因大多是因为配置不对,权限问题等没有遵循官方 ...

  2. COLA 4.0:应用架构的最佳实践

    前几天和几个饿了么的同学聊天,一听说他们还在用COLA 1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽.COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有 ...

  3. 架构师必备:多维度查询的最佳实践

    背景 有2种常见的多维度查询场景,分别是: 带多个筛选条件的列表查询 不含分库分表列的其他维度查询 普通的数据库查询,很难实现上述需求场景,更不用提模糊查询.全文检索了. 下面结合楼主的经验和知识,介 ...

  4. mysql c测试程序_MySQL · 最佳实践 · 一个TPC-C测试工具sqlbench使用-阿里云开发者社区...

    TPC-C是数据库系统经常使用的一个性能测试标准,目前开源社区里有几个可以使用的TPC-C测试工具,如BenchmarkSQL.DBT2. tpcc-mysql等.今天这里要介绍的是另一个TPC-C测 ...

  5. mysql递归死循环查询_MySQL 递归查询实践总结

    MySQL复杂查询使用实例 By:授客QQ:1033553122 表结构设计 SELECT id, `name`, parent_id FROM `tb_testcase_suite` 说明: par ...

  6. mysql 前缀_MySQL最佳实践:匹配前缀

    我有一个带代码的表和另一个带前缀的表.我需要匹配每个代码的(最长)前缀. 还有一个辅助范围,我必须限制前缀(这涉及引入其他表).我不认为这在大多数情况下都很重要,但这里是一个简化的(规范化的)方案(我 ...

  7. mysql json 创建索引_MySQL · 最佳实践 · 如何索引JSON字段

    概述 MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型.也方便了广大开发人员.但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少没有直接对其字段进行索引的 ...

  8. [导入]ExtJs 2.0 公司工程化应用的最佳实践(二)

    网站: JavaEye  作者: ppkosd  链接:http://ppkosd.javaeye.com/blog/132144  发表时间: 2007年10月16日 只有实践才是检验理论是否正确的 ...

  9. 基于Team Foundation Server 2010 Scrum 1.0与持续集成的最佳实践

    本文适合对Team Foundation Server 2010的部署和管理.模板配置有经验的人员阅读. 在阅读本文之前,需了解Scrum的一些基本知识:其次,需对Visual Studio Scru ...

最新文章

  1. 【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
  2. 2021中国华录杯·算法大赛活动进行中,超多奖励等你来拿
  3. 【多态】向上转型调用方法的规则
  4. java通过commons-fileupload实现多张图片的上传(servlet)
  5. patricia tree_前5名:专访Patricia Torvalds和Ada Initiative,印度采用开源,等等
  6. IDL读取TXT文件并写入二维数组中【转】
  7. 通过域策略登录脚本收集域用户的登录/注销信息
  8. OA系统:规避选型误区
  9. android8修改默认壁纸,给surfaceview设置默认背景
  10. 淘宝直播再升级!淘系自研GRTN 新一代多媒体传输网络
  11. 小程序云开发 免费版 云函数数量超过限制 怎么办
  12. 一个优秀的平面设计作品需要满足那些特点
  13. 刷题-整数和罗马数字转换
  14. 微信公众号内下载pdf等文件,受微信所限制,安卓和IOS不同处理方式(最最最优版)
  15. ADB卸载OPPO浏览器
  16. 必须强迫症!160GB硬盘双系统整数分区推荐方案
  17. 联发科技2023届提前批IC笔试(题目)
  18. CVPR2019中关于超分辨率算法的16篇论文
  19. C语言学习——从零开始学编程(第三篇:选择与循环)
  20. 重来之大学版|卸负篇——破除光环效应,学长学姐、教授老师真的有这么厉害吗?

热门文章

  1. AutoView自动为旧设计稿更新新设计稿尺寸
  2. 2023游戏开发制作如何选择合适的游戏引擎?看完本文就知道
  3. Springboot 阿里云服务器 发送 邮件问题
  4. Java 笔试:常见题目总结,html5在移动端开发优势更明显
  5. Box2D v2.1.0用户手册翻译 - 第10章 世界(World Class)
  6. Selenium Python
  7. win10下装win7双系统_《糖豆人》Win7可以玩吗?只能Win10环境使用?
  8. 科箭TMS云,助力网易考拉跨境电商物流云平台
  9. 重复图片的删除/查找
  10. 中职计算机课题研究题目参考,中职课题研究题目参考