Mysql 8.0 新特性
一 . 窗口函数
MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。
1.1 语法结构
1.2 序号函数
ROW_NUMBER() OVER ([PARTITION BY 列名1, 列名2, ...] -- 可选,按指定列分组,每组内单独编号ORDER BY 列名 [ASC|DESC], ... -- 必选,指定排序规则,决定编号顺序
)
RANK() OVER ([PARTITION BY 列名1, 列名2, ...] -- 可选,按指定列分组,每组内单独排名ORDER BY 列名 [ASC|DESC], ... -- 必选,指定排序规则,决定排名顺序
)
RANK()
和 ROW_NUMBER()
都是 SQL 中的窗口函数,用于对数据进行编号或排名,但核心区别在于处理相同排序值时的逻辑不同,
ROW_NUMBER()
:
即使排序的列值相同,也会为每行分配唯一且连续的序号(序号大小由数据库内部规则决定,无并列)。
例如:两个分数相同的行,可能被标记为 2 和 3。RANK()
:
当排序的列值相同时,会分配相同的排名,且后续排名会跳过中间的序号(允许并列,存在序号断层)。
例如:两个分数相同的行都排第 2,下一行则直接排第 4(跳过第 3)。
DENSE_RANK()函数
DENSE_RANK()函数对序号进行并列排序,并且不会跳过重复的序号,比如序号为1、1、2。
连续编号
DENSE_RANK() OVER ([PARTITION BY 列名1, 列名2, ...] -- 可选,按指定列分组,每组内单独排名ORDER BY 列名 [ASC|DESC], ... -- 必选,指定排序规则,决定排名顺序
)
对比
ROW_NUMBER()
:无并列,始终生成唯一连续序号(如 1,2,3,4)。RANK()
:允许并列,但会跳过序号(如 1,2,2,4)。DENSE_RANK()
:允许并列,序号连续(如 1,2,2,3)。
1.3 分布函数
PERCENT_RANK() OVER ([PARTITION BY 分区列]ORDER BY 排序列 [ASC|DESC]
)