Back to VNotes

Database / SQL

MySQL 与 SQL 基础(九)

记录 MySQL 启动方式、SQL 分类、DDL、DML、DQL、DCL 和表结构操作。

时间日期类型

类型大小范围格式描述
DATE3 bytes1000-01-01 至 9999-12-31YYYY-MM-DD日期值
TIME3 bytes-838:59:59 至 838:59:59HH-MM-SS时间值或持续时间
YEAR1 bytes1901 至 2155YYYY年份值
DATETIME8 bytes1000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH-MM-SS混合日期和时间值
TIMESTAMP4 bytes1970-01-01 00:00:01 至 2038-01-19 03:14:07YYYY-MM-DD HH-MM-SS混合日期和时间值,时间戳

窗口函数

介绍

MySQL 8.0后支持

窗口即为多个行的集合

语法

select
	column
	window_function() over()
from table;

与GROUP BY将一类数据合并为一行不同,窗口函数会为每一行返回一个基于其所属窗口的计算结果

over()子句,是窗口函数的核心,定义以什么方式将数据划分为窗口,并执行计算

over()子句的组成部分:

window_function() over (
	[partition by 分组字段]
	[order by 排序字段 [ASC|DESC]]
	[frame_clause]
)

partition by将结果集划分为多个分区,类似于group by的分组,若省略,整个结果集将被作为一个区

order by定义分区内的排序顺序

frame_clause定义窗口框架(决定窗口函数计算时使用哪些行):

​ 没有指定时默认为range between unbounded preceding and current row,即从分区的第一行开始到当前行结束,但排名函数会忽略这个框架,它们总是针对整个分区进行计算

​ 确定一个相对于当前行的计算范围

​ 通常在over()子句包含order by时使用

  • rows between ... and ...基于物理行位置(由order by决定)

unbounded preceding:分区开始

n preceding:当前行之后的n行

current row:当前行

n following:当前行之后的n行

unbounded following:分区结束

​ 可用于计算与上一行的差值,移动平均,累计计算

  • range between ... and ...基于排序键的值范围

unbounded preceding / following:含义与rows相同

n preceding:排序键值小于等于当前行键值 - n的所有行

current row:排序键值等于当前行的所有行

n following:排序键值大于等于当前行键值 + n的所有行

常用于时间间隔(如最近n天),数值范围等

窗口函数执行具体计算

常用窗口函数

  • 排名函数
函数描述特点
row_number()分配唯一序号无并列排名
rank()允许并列排名留出空位(1,2,2,4)
dense_rank()允许并列排名不留空位(1,2,2,3)
ntile(n)将数据分为n组用于分位数计算
  • 分析函数
函数描述
lag(column, n)获取前n行值
lead(column, n)获取后n行值
first_value(column)分区第一个值
last_value(column)分区最后一个值
nth_value(column, n)分区第n个值
  • 聚合函数
函数描述特点
sum()窗口内求和支持框架定义
avg()窗口内平均自动忽略NULL
count()窗口内计数DISTINCT可用
min() / max()窗口内极值性能优化