欢迎光临
我们一直在努力

SQL 临时表 + 游标 + 分页查询 全套笔记

一、临时表 #TempTable(核心概念)

1. 特点

  • 临时表不是真实物理表,存放在系统 tempdb 数据库

  • 会话关闭自动销毁,只在当前窗口有效

  • 前缀带 # 代表局部临时表

  • 作用:临时中转数据、分步处理数据、替代复杂子查询

2. 标准创建 + 判空删除模板(考试必写)

— 如果临时表存在,先删除(防止重复报错)
if OBJECT_ID('tempdb..#TempTable') is not null
p table #TempTable

— 创建临时表
create table #TempTable
(
e int not null,
eCount int null
)
Scor Scor dro


二、游标 Cursor(逐行遍历数据 重难点)

1. 游标六步标准流程(背诵)

定义游标 → 打开游标 → 抓取第一行 → while循环遍历 → 关闭游标 → 释放游标

2. 全局变量 @@FETCH_STATUS(必考)

  • @@FETCH_STATUS = 0:抓取数据成功,继续循环

  • @@FETCH_STATUS = -1:抓取失败/无数据

  • @@FETCH_STATUS = -2:行数据不存在

单@:自定义变量    双@@:系统内置变量

3. 案例1:游标遍历成绩统计,插入临时表

–1.定义接收变量
declare @Score int;
declare @ScoreCount int;

–2.定义游标(绑定查询结果集)
declare Score_cursor cursor for
select ScoreList.Score,COUNT(Score)as ScoreCount
from ScoreList
group by Score

–3.打开游标
open Score_cursor

–4.抓取第一行数据
fetch next from Score_cursor into @Score,@ScoreCount

–5.循环遍历所有行
while @@FETCH_STATUS=0
begin
— 逐行插入临时表
insert into #TempTable(Score,ScoreCount) values(@Score,@ScoreCount);
— 抓取下行
fetch next from Score_cursor into @Score,@ScoreCount
end

–6.关闭+释放
close Score_cursor
deallocate Score_cursor

— 查询临时表结果
select * from #TempTable

4. 批量插入优化(不用游标,考试加分写法)

游标逐行插入效率低,insert into … select 批量插入为标准写法

— 直接查询结果插入临时表(批量)
insert into #TempTable
select ScoreList.Score,COUNT(Score)as ScoreCount
from ScoreList
where Score>90 and Score<=100
GROUP BY Score

select * from #TempTable

5. 案例2:游标遍历学生表打印数据

— 定义接收字段变量
declare @StudentId int;
declare @StudentName varchar(20);
declare @Age int;
declare @Sex nvarchar(10);
declare @Address nvarchar(10);
declare @ClassId nvarchar(10);

–1.定义游标
declare My_Cursor cursor for
select * from Students where StudentId >=3;

–2.打开游标
open My_Cursor;

–3.抓取首行
fetch next from My_Cursor into @StudentId,@StudentName,@Age,@Sex,@Address,@ClassId;

–4.循环遍历
while @@fetch_status = 0
begin
@StudentId;
@StudentName;
rint @Age;
nt '——–'
– 继续抓下一行
etch next from My_Cursor into @StudentId,@StudentName,@Age,@Sex,@Address,@ClassId;
end

–5.关闭释放
close my_cursor;
deallocate my_cursor;
f – pri p print print


三、SQL 分页查询(两大版本 必考大题)

分页通用公式(背诵)

  • 页码:@CurrentPage

  • 每页条数:@PageSize

  • 起始行:(CurrentPage-1) * PageSize + 1

  • 结束行:CurrentPage * PageSize

1. 兼容低版本(Sql2012以下)ROW_NUMBER() 分页

原理:先排序生成行号,再根据行号区间分页

declare @CurrentPage int
declare @PageSize int

set @CurrentPage = 1 –当前第1页
set @PageSize =3 –每页3条

— 嵌套子查询生成行号RowId
select * from(
elect ROW_NUMBER() over (order by Age) as RowId ,* from Students
)as S
where RowId between (@CurrentPage-1)*@PageSize +1 and @CurrentPage*@PageSize
s

2. 高版本语法(Sql2012+)OFFSET FETCH 极简分页

企业常用、代码最短、考试最优解

declare @CurrentPage1 int
declare @PageSize1 int

set @CurrentPage1 = 1
set @PageSize1 =3

select * from Students
order by StudentId
offset (@CurrentPage1-1)*@PageSize1 rows — 跳过前面N条
fetch next @PageSize1 rows only — 只取当前页N条


四、终极考点总结(考前必背)

1. 临时表

  • #临时表会话级有效,自动销毁

  • 创建前必须判空删除,防止报错

2. 游标

  • 专门逐行操作数据集

  • 六步流程固定:定义→打开→抓取→循环→关闭→释放

  • 能不用游标就不用,批量插入优先 insert into select

3. 分页

  • 低版本用 ROW_NUMBER + 行号区间

  • 高版本用 OFFSET FETCH(简洁高效)

  • 分页必须先排序 ORDER BY

赞(0)
未经允许不得转载:171主机测评 » SQL 临时表 + 游标 + 分页查询 全套笔记
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址