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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 文章目录写在前面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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
23 4
|
6天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
19 1
|
13天前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
|
15天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
80 1
|
3天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
27 0
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
1月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
124 6
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
61 3
Mysql(4)—数据库索引
|
1月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
69 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
17天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
59 2