MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是MySQL Optimizer优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。
可以分组,而且可以再分组内排序。另外,窗口函数不会因为分组而减少原表的行数,这对我们在原表数据的基础上进行统计和排序非常有用。
窗口函数的语法结构:
函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])
或者是
函数 OVER 窗口名 ... WINDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])
举例:查询goods数据表中每个商品分类下价格降序排列的各个商品信息。
使用Rank()函数能够对序号进行并列排序,并且会跳过重复的序号,比如需要为1,1,3
等级值百分比函数: (rank - 1) / (rows - 1)
其中,rank的值为使用RANK函数产生的序号,rows的值为当前窗口的总计录值。
主要用于查询小于或等于某个值的比例。
返回当前行的前n行的expr的值。
FIRST_VALUE(expr)函数返回第一个expr的值
FIRST_VALUE(expr)函数返回最后一个expr的值
NTH_VALUE(expr,n)函数返回第n个expr的值
将分区中的有序数据分为n个桶,记录桶编号
公用表表达式的作用是可以替代子查询,而且可以被多次引用。递归公用表表达式对查询有一个共同根节点的树形结构数据非常高效,可以轻松搞定其他查询方式难以处理的查询。
语法结构:
WITH CTE名称
AS (子查询)
SELECT|DELETE|UPDATE 语句;
CTE实现
语法结构:
WITH RECURSIVE
CTE名称 AS (子查询)
SELECT|DELETE|UPDATE 语句;
案例:针对于我们常用的employees表,包含employee.id, last_ name和manager.id三个字段。如果a是b的管理者,那么,我们可以把b叫做a的下属,如果同时b又是c的管理者,那么c就是b的下属,是a的下下属。