MySql高级用法- 窗口函数

目录

一、窗口函数概念

二、示例数据创建

三、聚合函数搭配使用

1、Max()聚合函数

2、Sum()聚合函数

四、专用窗口函数搭配使用

4-1 序号专用函数

1、row_number() 当前行组内编号

2、rank() 带间隙排序

3、dense_rank() 不带间隙排序

4-2 分布专用函数

1、percent_rank() 百分比排序

2、cume_dist() 累积分布

4-3 头尾专用函数

1、first_value() 取组内第一个值

2、last_value() 取组内最后一个值

4-4 前后专用函数

1、lag() 取组内当前行前面的值

2、lead() 取组内当前行后面的值

4-5 其它专用函数

1、nth_value() 取框架内的第几个值

2、ntile() 组内再次分N组

        窗口函数是从mysql8.0开始才有的。

一、窗口函数概念

        窗口函数指在sql查询当中对数据进行分组计算或聚合运算,每一组数据相当于一个窗口。

与group by分组不同的是:

  •   group by是对每一个分组数据进行计算,返回每个分组的结果。(每一组返回一个结果)
  •   窗口函数是对每一个分组数据的每一条数据进行计算,返回每个分组的结果。(每一行返回一个结果)

注意: 窗口函数不会缺少数据,会返回每一行。

           group by会返回每一组数据的第一条数据,会缺少行。

            看见与over关键字进行搭配,就是窗口函数。

二、示例数据创建

create table windows(
id smallint unsigned not null auto_increment primary key,
name varchar(32),
val smallint);
 
insert into windows values
(null,'windows1',1),
(null,'windows1',2),
(null,'windows1',2),
(null,'windows1',3),
(null,'windows1',3),
(null,'windows1',3),
(null,'windows2',100),
(null,'windows2',200),
(null,'windows2',300),
(null,'windows2',400),
(null,'windows2',500);
 
select * from windows;

三、聚合函数搭配使用

 以下举两个常用的聚合函数例子:

1、Max()聚合函数

其中 PARTITION BY 关键字用于分组

SELECT 
		w.id,
		w.name,
		MAX(w.val) over(PARTITION BY w.name) AS maxVal
FROM
	windows w

结果返回的maxVal就是按照分组计算出来的每个分组的最大值。

注意:over单独使用,没有参数时,会把整个数据当成一组。

SELECT 
		w.id,
		w.name,
		w.val,
		MAX(w.val) over() AS maxVal
FROM
	windows w

2、Sum()聚合函数

对每一组内的数据进行相加

SELECT 
		w.id,
		w.name,
		w.val,
		SUM(w.val) over(PARTITION BY w.name) AS sumVal
FROM
	windows w

四、专用窗口函数搭配使用

4-1 序号专用函数

1、row_number() 当前行组内编号

        返回当前行在分组内的位置编号。

SELECT 
		w.id,
		w.name,
		w.val,
		ROW_NUMBER() over(PARTITION BY w.name) AS code
FROM
	windows w

  如果over里面加入oreder by子句,会影响输出结果。

SELECT 
		w.id,
		w.name,
		w.val,
		ROW_NUMBER() over(PARTITION BY w.name ORDER BY w.val DESC) AS code
  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 提供了一些高阶的查询语句用法,可以帮助我们更灵活、高效地进行数据查询。以下是一些常用的高阶用法: 1. 子查询: 子查询是将一个查询嵌套在另一个查询中的查询结构。它可以用作 `SELECT` 语句中的列、`FROM` 子句中的表、`WHERE` 子句中的条件等。 示例: ```sql SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM another_table WHERE condition); ``` 2. 联合查询: 联合查询用于将两个或多个查询的结果合并成一个结果集。可以使用 `UNION` 或 `UNION ALL` 运算符来执行联合查询。 示例: ```sql SELECT column_name FROM table1 UNION SELECT column_name FROM table2; ``` 3. 分页查询: 分页查询用于在结果集中进行分页显示数据。可以使用 `LIMIT` 子句指定要返回的记录数量,并使用 `OFFSET` 子句指定要跳过的记录数量。 示例: ```sql SELECT column_name FROM table_name LIMIT number_of_rows OFFSET offset_value; ``` 4. 排序: 可以使用 `ORDER BY` 子句对查询结果进行排序。可以按照一个或多个列进行升序或降序排序。 示例: ```sql SELECT column_name FROM table_name ORDER BY column_name ASC; ``` 5. 聚合函数和分组: 使用聚合函数(如 `SUM`、`AVG`、`COUNT` 等)可以对数据进行聚合计算。可以结合 `GROUP BY` 子句将结果集按照一个或多个列进行分组。 示例: ```sql SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; ``` 这些是一些常用的 MySQL 查询语句高阶用法,可以根据具体需求进行学习和使用。此外,MySQL 还提供了其他高级特性,如窗口函数、子查询优化、索引优化等,可以进一步提升查询性能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值