一、临时表 #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



