【MySQL】数据库函数通关教程下篇(窗口函数专题)(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 文章目录写在前面6 窗口函数6.1 窗口函数概述6.2 序号函数6.2.1 ROW_NUMBER()6.2.2 RANK()6.2.3 DENSE_RANK()6.3 开窗聚合函数6.4 分布函数6.4.1 CUME_DIST()6.4.2 PERCENT_RANK()6.5 前后函数-LAG与LEAD6.6 头尾函数写在最后

6 窗口函数

6.1 窗口函数概述

🆔 介绍:


MySQL 8.0新增窗口函数,又被称为开窗函数,与 Oracle 窗口函数类似,属于 MySQL 的一大特点;

非聚合窗口函数是相对于聚合函数来说的。聚合函数是对一组数据计算后返回单个值(即分组),非聚合函数一次只会处理一行数据。窗口聚合函数在行记录某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。

🍌 语法结构:

WINDOW_FUNCATION(EXPRESSION) OVER(
  PARTITION BY...
  ORDER BY...
  FRAME_CLAUSE
)

 其中,WINDOW_FUNCATION 是窗口函数的名称,EXPRESSION 是参数,OVER 子句包含三个选项:


1. 分区(PARTITION BY)

 PARTITION BY 选项用于将数据行拆分成多个分区(组)。如果省略了 PARTITION BY ,所有的数据将会作为一个组计算。

2. 排序(ORDER BY)

 ORDER BY 用于指定分区内的排序方式。

3. 窗口大小(FRAME_CLAUSE)

 FRAME_CLAUSE 用于在当前分区内指定一个计算窗口,也就是一个与当前计算行相关的数据子集。


6.2 序号函数

 序号函数有三种,分别为ROW_NUMBER()、RANK()、DENSE_RANK(),可以实现分组排序,并添加序号。


🍌 语法结构:

ROW_NUMBER|RANK()|DENSE_RANK() OVER(
  PARTITION BY ...
  ORDER BY ...
)

🐱 操作数据准备:

 先使用下面的 SQL 语句创建一个表,表中的数据如图所示。

create table student
(
    sid     int         null,
    name    varchar(20) null,
    gender  varchar(20) null,
    age     int         null,
    birth   date        null,
    address varchar(20) null,
    score   double      null
);



6.2.1 ROW_NUMBER()

🐰 下面这段代码中,实现了根据地点分组并按照成绩排序查询(逆序)的操作,该函数会自动标上序号ano:

SELECT name, address, score, ROW_NUMBER() OVER (PARTITION BY address ORDER BY score DESC ) AS ano
FROM student


观察上方结果,我们可以发现,ROW_NUMBER()函数在实现标注序号时并不会把相同排名的行标号为同一序号,如上图红圈中,乔巴和路飞均为85分,但是序号并不相同!


6.2.2 RANK()

🐯 在该函数的示例中,同样 实现了根据地点分组并按照成绩排序查询(逆序)的操作,该函数会自动标上序号ano:

SELECT name, address, score, RANK() OVER (PARTITION BY address ORDER BY score DESC ) AS ano
FROM student


与 ROW_NUMBER() 的标号方式不同的是,相同排名该函数会标注上相同序号!且序号可能不连续,如图中路飞、乔巴的序号均为1,而撒谎布为3


6.2.3 DENSE_RANK()

🐱 与 RANK() 函数不同的是,该函数在进行标号时 虽然也将相同排名的行标号为同一序号,但是后面的序号依然连续!

SELECT name, address, score, DENSE_RANK() OVER (PARTITION BY address ORDER BY score DESC ) AS ano
FROM student


 在上图中,路飞和乔巴的成绩相同,因此序号都为1。但是本应该排名为3的撒谎布被标号为了2!


6.3 开窗聚合函数

🆔 简介:


在窗口中每条记录动态地应用聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT()),可以 动态计算在指定窗口内的各种聚合函数的值。

🐰 操作示例:

 根据地点进行分组,使用SUM()计算总成绩,在该案例中,可以理解为根据地点分的每一组均为一个小窗口,而在这个窗口中计算了和:

SELECT name, address, score, SUM(score) OVER (PARTITION BY address) AS SUM
FROM student


需要注意的是,如果指定了排序方式,结果会有比较大的区别, 如下代码:

SELECT name, address, score, SUM(score) OVER (PARTITION BY address ORDER BY score) AS SUM
FROM student


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
SQL 关系型数据库 MySQL
关系型数据库mysql的CSV
【6月更文挑战第18天】
18 6
|
1天前
|
存储 监控 关系型数据库
关系型数据库mysql的BLACKHOLE
【6月更文挑战第18天】
17 4
|
1天前
|
存储 SQL 关系型数据库
|
1天前
|
存储 传感器 时序数据库
时序数据库influx有字符串拼接函数吗
【6月更文挑战第25天】时序数据库influx有字符串拼接函数吗
5 0
|
2天前
|
关系型数据库 MySQL Go
Mysql查看数据库时区并设置时区
Mysql查看数据库时区并设置时区
6 0
|
2天前
|
关系型数据库 MySQL 数据库
Mysql数据库服务的启动与停止及数据库选择
Mysql数据库服务的启动与停止及数据库选择
7 0
|
2天前
|
存储 关系型数据库 MySQL
关系型数据库MySQL的MyISAM
【6月更文挑战第17天】
20 11
|
3天前
|
存储 关系型数据库 MySQL
|
3天前
|
SQL 关系型数据库 MySQL
|
3天前
|
存储 关系型数据库 MySQL

热门文章

最新文章