大家好,我是北军。相互鼓励名言:有知识而不实践的人等于不酿蜜的蜜蜂。——萨迪今天的内容以实践为主,有兴趣的朋友可以一起操作~前言目前生产环境一直使用MySQL5.7版本,不敢贸然升级版本,涉及数据结构、数据备份等..但是看到各大平台分享的新版Mysql8的特性,还是忍不住强烈的好奇心,于是在本地搭建了一个Mysql服务,实际验证了一些新功能,着实给我带来了新的感悟。接下来,我将与您分享我的经验。概述Mysql是我从事开发行业三年多以来,接触最多的数据存储介质。它是一个关系数据库。开源免费,体积小,速度快,成本低。它受到大多数用户的喜爱,也受到了很多企业的青睐。距离正式版8.0.11发布已经四年多了。官方号称比5.7版本快了一倍(读写负载、IO密集型任务负载、高竞争负载等),并且新增了一个窗口。Functions(实现类似于聚合函数的新查询方式)等。下面将从窗口函数的特点来详细介绍。Windowfunction窗口函数,又称OLAP函数(OnlineAnalyticalProcessing,联机分析处理),用于对数据进行实时分析和处理;一般语法:selectwindowfunctionover(partitionbygroupingcolumnname,orderbysortingcolumnname)专用窗口函数:Rank函数:比如按类名分类,按序号排序,使用rank函数实现。相同的序号会出现在平行排序值中SELECT*,RANK()over(partitionby`NAME`ORDERBYNUM)asrankingFROMf0627ResultnamenumrankingA11A22A33A44A65B21B21B83sql说明:rank是一个排序函数,通过partitionby按类名分组(这里数据不会类似groupby去重),然后根据序号,最后的rangking字段就是分类后的排序结果。row_number函数:同理,如果是按类名分类,相同的序号会被忽略,依次生成排名值。SELECT*,ROW_NUMBER()over(partitionby`NAME`ORDERBYNUM)asrankingFROMf0627结果名称numrankingA11A22A33A44A65B21B22B83SQL说明:rank是排序函数,通过partitionby按类名分组(这里不会像groupby那样去重数据),然后根据序号,最终的ranking字段为分类后的排序结果,并列忽略在排名结果中。聚合窗口函数:sum()函数:比如按类名分类,按序号排序,累加序号,将分类后第一行到当前行的累加结果汇总到'求和'字段SELECT*,SUM(NUM)over(partitionby`NAME`ORDERBYNUM)as'sum'FROMf0627resultnamenumsumA11A23A36A410A616B24B24B812sql说明:sum()是一个求和函数,通过partitionby按类名分组(这里不会像groupby一样对数据进行去重),然后按照序号的正序,对序号的结果进行累加每个分类的第一行到当前行的数字汇总到'Summation'avg()函数:在上面sum函数的基础上,增加avg函数计算平均值SELECT*,SUM(NUM)over(partitionby`NAME`ORDERBYNUM)as'summation',AVG(NUM)over(partitionby`NAME`ORDERBYNUM)as'average'FROMf0627resultnamenumsummedaverageA111.0000A231.5000A362.0000A4102.5000A6163.2000B242.0000B242.0000B8124.0000SQL描述:avg()是一个平均值function,通过partitionby(这里不会像groupby那样去重数据)按类名分组,然后将每个类别先根据序号排序将行到当前行的序号累加结果平均到'average'字段CTE表达式(CommonTableExpressions,公用表表达式):结合窗口函数,使复杂的嵌入式查询更清晰,提高可读性WITHcteas(SELECT*,SUM(NUM)over(partitionby`NAME`ORDERBYNUM)assuming,AVG(NUM)over(partitionby`NAME`ORDERBYNUM)asavgingFROMf0627)SELECT*FROMctewhereavging>2结果名称numsumingavgingA4102.5000A6163.2000B8124.0000sql说明:withcteas(sql)可以将sql结果定义为cte的派生表,直接查询派生表即可过滤平均值大于2的结果SummarynewMysql8.0的window函数大大简化了sql实现语句,实现了更复杂的数据逻辑,可以满足更多的开发场景,从而相应降低代码开发成本。当窗口函数与cte结合使用时,可以对嵌套查询进行分层,使得语句的可读性更强,性能当然也有保证。以上就是分享的全部内容,只是mysql8新特性的一小部分,其他特性还在探索中,有什么问题或者想法可以私信给小编,我们一起学习并一起讨论。
