当前位置: 首页 > java >正文

第三阶段数据库-9:循环,编号,游标,分页

1_sql中的循环,编号

(1)sql 中没有for循环,只有while循环,

begin end 中间的就是while执行的语句,相当于{}

declare @i int;
set @i=1;
--begin   end 中间的就是while执行的语句,相当于{}
while(@i<=100)
begin
declare @rand int;
--rand(): 产生0-1之间的随机小数,不包括0和1
--产生x-y之间的随机数 rand() * (y-x)+x;
--round()四舍五入取整
set @rand=rand()*(100-60)+60
print @rand
--sqlserver 中的字符串和数字相加,先把字符串转换成数字再和数字计算
insert into StudentInfo(StuName,Score)values('张三'+cast(@i as varchar),@rand);
set @i+=1;
end

(2)重新编号

row_number对查到的数据进行重新编号,赋予他来连续的编号

over 编号的依据

select *, row_number() over(order by StuName) as '重新编号' from StudentInfo
​
select ProvinceName+City+Area, row_number() over(order by AddressId) as '重新编号' from AddressInfo

2_游标

(1)游标,是一种数据访问机制,用于逐行处理查询的结果,允许开发者或应用程序在结果集上定义 检索 和修改数据

(2)创建游标并使用,

declare @StuId int;
declare @StuName varchar(20);
declare @Score1 int;
--1.定义游标
declare My_Cursor cursor for
select * from StudentInfo where StuId>=130;
--2.打开游标
open My_Cursor;
--3.让游标指向结果集的第一行,并拉取第一行的数据,存储到变量上
fetch next from  My_Cursor into @StuId,@StuName, @Score1;
--4.循环游标
--一个@是开发者自定义的变量
--两个@开头是sql server自定义的变量名称
--@@fetch_status作用 sql中游标指针的位置判断,代表游标读取下一行数据是否成功
--理解它为枚举,有三种值:0代表读取成功,-1表示语句失败或此行不在结果集中  -2表示被提取的行不存在
while @@fetch_status=0
begin
print  @StuId;
print @StuName;
print  @Score1;
print '==============';
fetch next from  My_Cursor into @StuId,@StuName, @Score1;
end
--5.关闭游标
close My_Cursor;
--6.释放游标
deallocate My_Cursor

3_临时表

(1)临时表,临时存储的表,不是真实的表,类似于C#中的匿名函数

(2)判断临时表是否存在,如果存在则删除

if object_id('tempdb..#TempTable') is not null   
drop table #TempTable  --删除临时表的结果 表结构也删除
--delete from  #TempTable --删除临时表的结果 表结构不删除

(2)创建临时表,命名必须以#开头

--创建临时表 命名必须以#开头
create table  #TempTable (Score  int not null,ScoreCount  int null
);

(3)向表中插入数据

  • 循环向临时表插入数据 (不推荐

  • 直接使用select 语句配合 insert into 语句(推荐)

select * from #TempTable
--向临时表中插入数据
--1.循环向临时表插入数据(不推荐)
declare @Score int;
declare @ScoreCount int;
-- a.定义游标,是一种数据访问机制,用于逐行处理查询的结果,允许开发者或应用程序在结果集上定义 检索 和修改数据
declare Score_cursor cursor for  
select  Score ,Count(Score) as ScoreCount from StudentInfo
where Score>=90 and Score<=100  
group by Score  
--b.打开一个游标
open Score_cursor;
--c.让游标指向结果集第一行,并且拉取第一行数据并存储到相应的变量上
--fetch 拿来 next 下一个
fetch next from Score_cursor into  @Score,@ScoreCount;
--d循环游标
while @@FETCH_STATUS=0
begin
insert into #TempTable(Score,ScoreCount)values(@Score,@ScoreCount);
fetch next from Score_cursor into  @Score,@ScoreCount;
end
--e.关闭游标
close Score_cursor;
--f.释放游标
deallocate Score_cursor
​
select * from #TempTable
where ScoreCount>=4
order by ScoreCount desc;
​
--2.直接使用select语句配合insert Into语句(推荐)
--select 字句查询的结果要和 insert into 语句的列个数 顺序 类型 一一对应
insert into #TempTable
select  Score ,Count(Score) as ScoreCount from StudentInfo--查询
where Score>=90 and Score<=100          --筛选
group by Score  
​
select * from #TempTable

4_分页

(1)row_number over 方式 sql 2012 以下版本推荐使用

--分页
--100 条数据 10页 一页显示10条,
--当前页currentPage=1 设置每页显示的条数 pageSize=10
--第一页 rowId>=10 and RoeId<=10 1-10
--第二页 rowId>=11 and RoeId<=20 11-20
--第三页 rowId>=21 and RoeId<=30 21-30\
--每页开始的RowId : (currentPage-1)*pageSize+1
--每页结束的RoeId:currentPage*pageSize
--1.row_number over 是方式 sql 2012 以下版本推荐使用
--当前页,可以声明的时候赋值,也可以先声明再赋值
--declare  @currentPage int=10;
declare  @currentPage int;
declare  @pageSize int;--每页显示的条数,10,20,30...
set @currentPage=1;
set @pageSize=10;
​
--嵌套查询
--外层查询select * from (--内层查询,子查询-- row_number() over(order by Score asc)按照成绩升序重新编号--返回一个新表select row_number() over(order by Score asc) as RowId ,* from StudentInfo) as S --利用新表进行筛选where RowId between ( @currentPage-1)*@pageSize+1 and @currentPage * @pageSize

(2)offset fetch next 方式 sql 2012版本以上推荐;

offset()偏移 ;fetch拿取

declare  @currentPage1 int;
declare  @pageSize1 int;
set @currentPage1=1;
set @pageSize1=10;
​
select * from StudentInfo --查询
order by StuId          --根据id排序
offset (@currentPage1-1)*@pageSize1 rows  --offset 偏移,跳过多少行
fetch next @pageSize1 rows only     --读取接下来的多少行数据

http://www.xdnf.cn/news/18576.html

相关文章:

  • 字节跳动开源Seed-OSS:36B参数模型以512K上下文与可控思考预算重新定义AI实用主义
  • [激光原理与应用-320]:结构设计 - Solidworks - 软件工具UI组织的核心概念
  • 解决散点图绘制算法单一导致的数据异常问题
  • STM32窗口看门狗(WWDG)深度解析:精准守护嵌入式系统的实时性
  • python学习DAY49打卡
  • SHAP分析+KOA-RIME开普勒结合霜冰算法双重优化BP神经网络+9种映射方法+新数据预测!机器学习可解释分析!
  • 【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型
  • 云原生俱乐部-k8s知识点归纳(8)
  • day40-tomcat
  • k8s之 Pod 资源管理与 QoS
  • Angular初学者入门第三课——工厂函数(精品)
  • 日志搜索系统前端页面(暂无后端功能)
  • webrtc弱网-SendSideBandwidthEstimation类源码分析与算法原理
  • 手机横屏适配方案
  • 20250823给荣品RD-RK3588开发板刷Rockchip原厂的Buildroot【linux-5.10】时调通AP6275P的WIFI【源码部分】
  • ArkTS 语言全方位解析:鸿蒙生态开发新选择
  • 【AI基础:神经网络】17、神经网络基石:从MP神经元到感知器全解析 - 原理、代码、异或困境与突破
  • 线程间Bug检测工具Canary
  • uniapp 页面跳转及字符串转义
  • Redis学习笔记 ----- 缓存
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(八)按键事件
  • 大语言模型应用开发——利用OpenAI函数与LangChain结合从文本构建知识图谱搭建RAG应用全流程
  • 【KO】前端面试七
  • 20250823给荣品RD-RK3588开发板刷Rockchip原厂的Android14【EVB7的V10】时调通AP6275P的WIFI
  • react相关知识
  • GitLab CI:Auto DevOps 全解析,告别繁琐配置,拥抱自动化未来
  • 运行npm run命令报错“error:0308010C:digital envelope routines::unsupported”
  • 二叉树的经典算法与应用
  • 【网安干货】--操作系统基础(上)
  • USRP采集的WiFi信号绘制星座图为方形