🏆🏆今天是【全国科技者工作日】,在这个特别的日子里,自然要写篇文章!
最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。
🏆🏆非常感谢大家的支持和活动期间的文章输出,导师也是忙里抽空给大家准备分享的内容,也是尽力了,所以分享的知识点主要是偏向于基础和基本的实战,虽然不是讲解的很系统,但是能够了解到一定的实战信息
🏆🏆期待我们的下次学习,导师将会在6月或者7月再次发起新星计划,本次活动也得到学员和平台的肯定,平台也是非常欢迎导师再次发起新星计划,非常感谢!
目录
- 1、创建表
- 1.1、模拟生成30万学生记录
- 2、知识点
- 2.1、重新排序函数
- 2.2、分页查询
- 2.3、排名函数
- 原计划
- 变更计划
有时候计划赶不上变化,原本想在第二周对索引知识点进行实战,但遇到模拟数据量不够且在数据库批量生成会比较慢,索引查询效果也不明显,所以变更了计划!
1、创建表
1.1、模拟生成30万学生记录
1)大家根据上面提供的sql语句,模拟生成30万名学生记录
记录总数:6个年纪30万名学生3科=5400000,540万条记录
2)添加数据大概耗时
- 代码
declare @classCount int
set @classCount=1
declare @className nvarchar(50)
declare @courseName nvarchar(50)
declare @scoreValue int
declare @studentCount int
set @studentCount=80
-- 定义一个姓氏表变量,表添加两个字段,自增编号和名字
declare @surnameTable table(
id int identity(1,1) primary key,
name nvarchar(10)
)
-- 定义一个名字表变量,表添加两个字段,自增编号和名字
declare @nameTable table(
id int identity(1,1) primary key,
name nvarchar(10)
)
-- 姓和名字
-- 姓氏
insert @surnameTable values
('王'),('李'),('张'),('刘'),('陈'),('杨'),('黄'),('赵'),('周'),('吴'),
('徐'),('孙'),('马'),('胡'),('朱'),('郭'),('何'),('罗'),('高'),('林')
-- 名称
insert @nameTable values
('芸'),('荷'),('星'),('秋'),('嘉'),('娜'),('珊'),('菲'),('素'),('嫣'),
('慧'),('慕'),('歆'),('巧'),('绮'),('羽'),('静'),('柔'),('采'),('沐'),
('苑'),('姣'),('芳'),('宁'),('沛'),('玥'),('文'),('如'),('悦'),('若'),
('德'),('蕾'),('颜'),('依'),('盼'),('菀'),('秀'),('草'),('莺'),('倩'),
('柳'),('娴'),('彨'),('舒'),('雅'),('淑'),('冉'),('云'),('凝'),('棋')
-- 循环遍历班级
declare @num int
set @num=0
while @classCount<=6 begin
set @studentCount=300000
-- ===年级信息===
set @className=convert(varchar(10),@classCount)+'年级'
set @classCount+=1
-- ===/年级信息===
-- ===遍历创建学生记录===
while @studentCount>0 begin
set @num+=1
-- 生成名字
declare @name nvarchar(50)
declare @nameLength int
set @nameLength=1+round(rand()*1,0)
set @name=(select name from @surnameTable where id=round(rand()*20,0))
while(@nameLength>0) begin
set @name+=(select name from @nameTable where id=round(rand()*50,0))
set @nameLength-=1
end
set @name+=convert(nvarchar(10),@num)
if @name=null begin
set @name='张三'+convert(nvarchar(10),@num)
end
-- ===年级课程===
-- 语文
set @courseName='语文'
set @scoreValue=round(rand()*50+50,0)
insert into student_score_30wan(studentName,className,courseName,scoreValue,createTime)
values(@name,@className,@courseName,@scoreValue,getdate())
-- 数学
set @courseName='数学'
set @scoreValue=round(rand()*50+50,0)
insert into student_score_30wan(studentName,className,courseName,scoreValue,createTime)
values(@name,@className,@courseName,@scoreValue,getdate())
-- 英语
set @courseName='英语'
set @scoreValue=round(rand()*50+50,0)
insert into student_score_30wan(studentName,className,courseName,scoreValue,createTime)
values(@name,@className,@courseName,@scoreValue,getdate())
-- ===/年级课程===
set @studentCount-=1
end
end
--select * from student_score_10wan
--truncate table student_score
--truncate table student_score_10wan
🏆🏆 原则:Write Less Do More!
🍎🍎简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!
2、知识点
2.1、重新排序函数
1)row_number()
此函数是对查询结果集进行排序重新编号
一般都会配合over()函数进行使用
2)over()
必填参数:一般会有一个order by + 排序字段
选填参数:partition by + 需要分组的字段(可以是单个也可以是多个组合)
3)查询按年级和班级进行分组以及成绩降序排序前20名学生
关键sql语句:row_number() over(partition by className,courseName order by scoreValue desc)
-
简单解释就是:
partion by className,courseName:按班级和课程分组
rder by scoreValue desc:然后在班级和课程分组里再按成绩降序排序
row_number:根据上面分组和排序,重新生成从1开始按顺序排序,1、2、3… -
表别名或字段别名
顺便提一下,在表明或者字段名后面跟着 as + 别名,也可以直接省略as,直接就是空格+别名
比如:
-
代码如下
select
row_number() over(partition by className,courseName order by scoreValue desc) as rowid,
a.*
from student_score_30wan as a
- 上面语句查询540万条记录,重新分组排序耗时差不多2分钟
2.2、分页查询
1)从下图可知,不可能每次都是查询出540万条记录
一般在系统里,都是按10条一页、20条一页的方式查询
2)查询需要1到20的记录
select b.* from(
select
row_number() over(partition by className,courseName order by scoreValue desc) as rowid,
a.*
from student_score_30wan as a
) b
where b.rowid>=1 and b.rowid<=20
3)动态分页查询语句
-- 定义一个变量,就是当前页
declare @pageIndex int
set @pageIndex=1000
-- 定义一个变量,就是一页20条记录
declare @pageSize int
set @pageSize=20
--通过改变当前页的值来实现分页查询
select b.* from(
select
row_number() over(partition by className,courseName order by scoreValue desc) as rowid,
a.*
from student_score_30wan as a
) b
where b.rowid>=(@pageIndex-1)*@pageSize and b.rowid<=@pageIndex*@pageSize
2.3、排名函数
1)rank()
排名函数,同样是对查询数据集进行序号重新编号,唯一不同的是,如果值相同,那么会有一个名次并列,就是名次相同的情况
2)partition by
分组关键词
比如:partition by className,courseName,按班级和课程排名,意思就是一年级语文成绩排名、二年级数学成绩排名等
3)排名查询
- 代码
select b.* from(
select
rank() over(partition by className,courseName order by scoreValue desc) as rankid,
a.*
from student_score_20wan as a
) b
where b.rankid>=10 and b.rankid<=20
- 效果
🍎🍎 本篇到此结束,感谢阅读的小伙伴,打个小小的ad,欢迎关注导师的公众号【有趣小馆】,导师会时不时发布一些有趣好玩的功能,欢迎关注!