sql函数--04---ROW_NUMBER() OVER()函数用法详解

本文详细介绍了MySQL8引入的新特性——窗口函数,包括ROW_NUMBER()OVER()函数的使用方法和案例。通过案例展示了如何在无分组、分组以及结合WHERE子句的情况下进行排序和筛选,以及在学生成绩和班级信息表中的实际应用。窗口函数使得在SQL查询中实现更复杂的数据分析和排序成为可能。
摘要由CSDN通过智能技术生成

ROW_NUMBER() OVER()函数

使用范围:

  • 这个函数可以Oracle中使用
  • 这个函数可以hive可以用
  • MySQL5.7用不了,MySQL8以后加入了窗口函数

语法格式:

row_number() over(partition by 分组列 order by 排序列 desc)

注意:

  • 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。

案例 1

表数据:

create table TEST_ROW_NUMBER_OVER(
       id varchar(10) not null,
       name varchar(10) null,
       age varchar(10) null,
       salary int null
);
select * from TEST_ROW_NUMBER_OVER t;
 
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a',10,8000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a2',11,6500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b',12,13000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b2',13,4500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c',14,3000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c2',15,20000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,'d',16,30000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,'d2',17,1800);

一次排序:对查询结果进行排序(无分组)

SELECT id,NAME,age,salary,row_number()over(ORDER BY salary DESC) rank
FROM TEST_ROW_NUMBER_OVER t

在这里插入图片描述

进一步排序:根据id分组排序

select id,name,age,salary,row_number()over(partition by id order by salary desc) rank
from TEST_ROW_NUMBER_OVER t

在这里插入图片描述

再一次排序:找出每一组中序号为一的数据

SELECT * FROM(SELECT id,NAME,age,salary,row_number()over(PARTITION BY id ORDER BY salary DESC) rank
FROM TEST_ROW_NUMBER_OVER ) t
WHERE rank <2

在这里插入图片描述

排序找出年龄在13岁到16岁数据,按salary排序

select id,name,age,salary,row_number()over(order by salary desc)  rank
from TEST_ROW_NUMBER_OVER t where age between '13' and '16'

在这里插入图片描述

结果:结果中 rank 的序号,其实就表明了 over(order by salary desc) 是在where age between and 后执行的

案例 2

表数据:

  • 创建学生成绩表
  • 班级信息表
  • 并插入测试数据
/*-创建学生成绩表-*/
CREATE TABLE StuScore
(
	StuID INT,            
	StuName VARCHAR(20),  
	ClassID INT,          
	SUBJECT VARCHAR(20), 
	Score INT             
);
 
/*-创建班级信息表-*/
CREATE TABLE ClassInfo
(
	ClassID INT,           
	ClassName VARCHAR(20)
);
 
/*-添加学生成绩信息-*/
INSERT INTO StuScore VALUES(1,'张三',1,'语文',60);
INSERT INTO StuScore VALUES(1,'张三',1,'数学',90);
INSERT INTO StuScore VALUES(1,'张三',1,'英语',70);
INSERT INTO StuScore VALUES(2,'李四',2,'语文',100);
INSERT INTO StuScore VALUES(2,'李四',2,'数学',90);
INSERT INTO StuScore VALUES(3,'王五',2,'语文',80);
 
/*-添加班级信息-*/
INSERT INTO ClassInfo VALUES(1,'高一(1)班');
INSERT INTO ClassInfo VALUES(2,'高二(3)班');

在这里插入图片描述
在这里插入图片描述

按学生成绩排序,并为每条排序后的记录返回一个序号

SELECT ROW_NUMBER() OVER(ORDER BY Score DESC) AS Row_Index,* 
FROM StuScore

在这里插入图片描述

按学生编号(StuID)分组,且按学生成绩排序,再为每条排序后的记录返回一个序号


SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,* 
FROM StuScore

在这里插入图片描述

查询每个学生最高的成绩

SELECT t.* FROM(
	SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,* 
	FROM StuScore
) t WHERE t.Row_Index = 1

在这里插入图片描述
在这里插入图片描述

查询每个学生最高的成绩,并关联班级名称。

在这里插入图片描述

SELECT t1.StuID,t1.StuName,t1.Subject,t1.Score,t2.ClassName FROM(
	SELECT tt.* FROM(
		SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,* 
		FROM StuScore
	) tt WHERE tt.Row_Index = 1) t1
LEFT JOIN ClassInfo t2 ON t1.ClassID = t2.ClassID

在这里插入图片描述

MySQL8新特性----窗口函数

MySQL基础–10—MySQL8新特性----窗口函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值