【Sql Server】查询实战,实现不同班级的排行查询并且批量模拟数据进行查询测试

💗💗 作者:小5聊
🏆🏆 原则:Write Less Do More!
📋📋 简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!
🎉🎉 场景:根据学生的C语言成绩,能够查询出不同班级前3名或前10名学生成绩排名

1、查询场景

1)场景描述

能够根据不同的班级,查询每个班级C语言成绩前10名同学,序号从1到10升序显示。
如果是做学校相关项目,那么接触到这类需求的应该会很常见

2)预期效果

查询语句试下如下表格效果
以下举例展示一年级一班和一年级二班语文成绩排在前十名的学生排名。
这里模拟的姓名数据,可以通过之前的一篇文章来生成,点击跳转随机生成姓名记录

编号班级排名姓名C语言成绩
111软件1班1赵慧100
211软件1班2胡歆98
311软件1班3郭菲歆95
411软件1班4朱苑92
511软件1班5张星静90
611软件2班1周嫣嫣89
711软件2班2刘菲柔88
811软件2班3孙嫣星85
911软件2班4林珊82
1011软件2班5林羽79
1111软件3班1陈巧静89
1211软件3班2胡慕沐88
1311软件3班3刘嘉绮85
1411软件3班4徐素82
1511软件3班5何星79

2、知识点

1)排名函数

row_number()和over()
从下图可知,必须两者结合起来使用。用于对排序产生新的序号,有了新的序号就可以重新进行排序
在这里插入图片描述
它也是2005开始有的新函数,也常用于高效的分页

2)over()对比排序

over()里头的分组以及排序的执行会在where 、group by、 order by之后执行
比如:根据添加时间降序或者升序,根据实际业务需求来定

3)判断表是否存在

object_id(N’表名称’)
如果存在表,那么会返回这个表的id值,id字段属于sysObjects系统对象表

3、创建成绩表

1)简单描述

此处通过创建单张表进行模拟数据【班级课程学生成绩表】

2)字段设计

自增编号、班级名称、学生名称、课程名称、成绩、添加时间

3)表命名小技巧

可以从整体到细节,从大模块和具体功能,比如,ClassCourseStudentScoreTable,组成单词=Class+Course+Student+Score+Table
在实际工作中,可能每个地方都会有一定的命名标准,都是大同小异,目的是为了快速识别表的描述和作用,否则就增加了运维成本

if(object_id(N'ClassCourseStuentScoreTable') is null) begin
    create table ClassCourseStuentScoreTable(
        id int identity(1,1) primary key,
        className nvarchar(50),
        courseName nvarchar(50),
        studentName nvarchar(50),
        scoreValue int,
        addTime datetime
    )
end
else begin
    print('表已存在')
end

4、模拟数据

1)90条记录

模拟3个班级,每个班级30名学生的C语言成绩,总共90条记录

2)完整代码


-- 班级数量
declare @classCount int
set @classCount=3
 
-- 班级名称
declare @className nvarchar(50)
set @className=''
 
-- 课程名称
declare @courseName nvarchar(50)
set @courseName='C语言'
 
-- 学生名称
declare @studentName nvarchar(50)
set @studentName=''

-- 此处放第一层循环代码
-- 学生课程成绩
declare @scoreValue int
declare @studentCount int

while(@classCount>0) begin
    print(@classCount)
    
    if(@classCount=3)
        set @className='11软件3班'
    else if(@classCount=2)
        set @className='11软件2班'
    else if(@classCount=1)
        set @className='11软件1班'
    

    -- 此处放第二层循环代码
    --
    set @studentCount=30
    while(@studentCount>0) begin
        -- ===随机姓名===
        -- 定义一个姓氏表变量,表添加两个字段,自增编号和名字
        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 @name nvarchar(50)
        declare @nameLength int
        set @nameLength=1+round(rand()*1,0)
        set @name=(select name from @surnameTable where id=round(rand()*20+1,0))
        
        while(@nameLength>0) begin
            set @name+=(select name from @nameTable where id=round(rand()*20+1,0))
            set @nameLength-=1
        end
        
        set @studentName=@name
        -- ===/随机姓名===
        
        set @scoreValue=30+round(rand()*70,0)
        
        insert into ClassCourseStuentScoreTable(className,courseName,studentName,scoreValue,addTime)
        values(@className,@courseName,@studentName,@scoreValue,getdate())
        
        set @studentCount-=1
    end
    --
    
    set @classCount-=1
 
    print(@className)
end

select * from ClassCourseStuentScoreTable
--truncate table ClassCourseStuentScoreTable

5、查询各个班级前3名

1)查询语句
-- 查询各个班级的前三名
select * from(
    select 
    className 班级,
    courseName 课程,
    studentName 学生,
    scoreValue 成绩,
    row_number() over(partition by className order by scoreValue desc) 排名
    from ClassCourseStuentScoreTable
) a
where a.排名<=3
2)查询效果

在这里插入图片描述

6、常见函数回顾

Sql Server常用函数分为:排名函数、字符串函数、数学函数、系统函数、聚合函数等

1)排名函数
编号函数名用途
1row_number()按顺序对所有行进行编号
2rank()为关系提供相同的数值
3over()提供数据的升降序

在这里插入图片描述

2)字符串函数
编号函数名用途
1charindex()字符索引
2len()统计字符串的长度
3upper()将字母全部变为大写
4Ltrim()移除左边空格
5Rtrim()移除右边空格
6Left()获取左边指定长度字符串
7Right()获取右边指定长度字符串
8stuff()删除并替换
9replace()查询并替换

在这里插入图片描述

3)日期函数
编号函数名用途
1getdate()获取当前时间
2dateadd()当前时间加减
3datediff()时间差
4datename()返回星期几字符串
5datepart()获取年月日值,整型

在这里插入图片描述

4)数学函数
编号函数名
1rand()
2abs()
3ceiling()
4floor()
5power()
6round()
7sign()
8sqrt()

在这里插入图片描述

5)系统函数
编号函数名
1convert()
2current_user
3datalength()
4host_name()
5system_user
6user_name()

在这里插入图片描述

6)聚合函数
编号函数名
1sum()
2avg()
3max()
4min()
5count()

在这里插入图片描述

🎉🎉🎉 总结:不积跬步无以至千里,编程进步的方式之一就是不停的练习!🎉🎉🎉

  • 30
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
由于微软默认提供的企业管理器,很多用户使用困难,有不少用户也没有安装这个软件.另外很多用户将数据库服务器的远程连接给关掉或者将数据库服务器安装在局域网内 使得外部的使用管理有了不少的麻烦,SSOM系统可以安装在你的内部服务器上,这样外部用户直接用(local)连接就可以管理了 在mysql服务器管理中,目前用phpmyadmin软件进行在线管理,而SQL Server(mssql)也需要类似这样一款在线管理工具,就这样由BBSGOOD团队开发的针对mssql管理的SSOM系统诞生了. 该系统可以在线管理已创建的SQL Server(mssql)数据库,目前主要功能如下: 连接你的SQL数据库,进行 1.建立,删除,修改数据表 2.建立,删除,修改每个表的字段操作 3.SQL语句执行容器,可以执行所有的SQL语句,包括存储过程,也可以检索、插入、更新、删除记录等操作 4.进行数据库的备份 目前该产品首次测试发布编码为中国大陆的GB2312编码 使用说明: 1.在数据库地址一栏中,输入你数据库服务器的IP地址,如果和本系统是同机的话,也可以用(local)来连接 输入你的数据库名称,数据库访问的帐号和密码,点击登陆即可. 2.登陆后,点击左栏的数据库,即可管理数据库中所有的表,字段,记录等数据. 3.点击左栏的SQL语句,还可以运行sql脚本,你所需要的操作均可以完成,包括用select语句查询出记录. 4.点击左栏的数据库备份,就可以对你的数据库进行备份了,注意备份的路径是数据库服务器上面的路径.
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值