建表参考:SQLServer脚本建库表
写法1:top ... not in ...
select top 5 * from student -- 查询前5行学生记录select * from studentwhere s_id not in ('ST001','ST004') -- 查询除了'ST001','ST004'的学号以外的学生记录select top 5 * from student -- 第一页where s_id not in (select top 0 s_id from student order by s_id)select top 5 * from student -- 第二页where s_id not in (select top 5 s_id from student order by s_id)select top 5 * from student -- 第三页where s_id not in (select top 10 s_id from student order by s_id)-- 使用变量:页码 pageIndex , 每页大小 pageSizedeclare @pageIndex int = 1declare @pageSize int = 5select top (@pageSize) * from studentwhere s_id not in (select top ((@pageIndex-1)*@pageSize) s_id from student order by s_id)
写法2(推荐):row_number() 行号 over(排序列)
select ROW_NUMBER() over(order by s_id) as 行号, * from student -- 为查询的记录集输出行号select * from(select ROW_NUMBER() over(order by s_id) as num, * from student) twhere num between 1 and 5 -- 第一页,从第1行到第5行select * from(select ROW_NUMBER() over(order by s_id) as num, * from student) twhere num between 6 and 10 -- 第二页,从第6行到第10行-- 使用变量:页码 pageIndex2 , 每页大小 pageSize2declare @pageIndex2 int = 1declare @pageSize2 int = 5select * from(select ROW_NUMBER() over(order by s_id) as num, * from student) twhere num between ((@pageIndex2 - 1) * @pageSize2 + 1) and (@pageIndex2 * @pageSize2)-- 计算公式:从 ((页码-1)*每页大小+1)行 到 (页码 * 每页大小)行-- 使用row_number分页查询学生、课程、成绩-- 第一步:连接查询select row_number() over(order by a.s_id) as 行号,a.s_id as 学号,c.c_id as 课程号,s_name as 姓名,c_name as 课程名称,sc_score as 分数from student a , score b, course cwhere a.s_id = b.s_idand b.c_id = c.c_id-- 第二步:分页查询select * from(select row_number() over(order by a.s_id) as 行号,a.s_id as 学号,c.c_id as 课程号,s_name as 姓名,c_name as 课程名称,sc_score as 分数from student a , score b, course cwhere a.s_id = b.s_idand b.c_id = c.c_id) twhere 行号 between 1 and 3-- 第三步:分页带条件查询select * from(select row_number() over(order by a.s_id) as 行号,a.s_id as 学号,c.c_id as 课程号,s_name as 姓名,c_name as 课程名称,sc_score as 分数from student a , score b, course cwhere a.s_id = b.s_idand b.c_id = c.c_idand sc_score > 70 -- 查询条件,成绩>70) twhere 行号 between 1 and 3
把分页算法封装到数据库的存储过程
作用:重用、实现更多的功能(可以获得总行数、总页数)
-- 基本分页存储过程:分页查询每个学生的成绩记录create proc sp_scorepage(@pageIndex int, -- 输入参数:页码@pageSize int, -- 输入参数:每页大小(每页多少行)@rowcount int output, -- 输出参数:总行数@pagecount int output -- 输出参数:总页数)asbegin-- 1 计算总行数:多表查询(学生表、成绩表)结果的总行数,考虑没有参加考试的学生记录都要查询出来,所以用外连接select @rowcount = count(*) -- 为总行数设置输出参数结果from student a left join score bon a.s_id = b.s_id-- 2 计算总页数:if(@rowcount % @pageSize=0)beginset @pagecount = @rowcount @pageSize -- 为总页数设置输出参数结果endelsebeginset @pagecount = @rowcount @pageSize + 1end-- 3 row_number分页查询:使用外连接查询所有的学生记录select * from(select row_number() over(order by a.s_id) as num, -- 行号a.s_id, -- 学号s_name, -- 姓名isnull(c_name,'未考') as c_name, -- 课程名 (null值要处理)isnull(convert(varchar(10),sc_score),'无') as sc_score -- 成绩 (null值处理要注意将数字的分数结果转字符串输出)from student a left join score b -- 学生表 与 成绩表 外连接查询,以学生表为主表方向查询所有学生记录on a.s_id = b.s_idleft join course c -- 接着使用外连接课程表on b.c_id = c.c_id) twhere num between ((@pageIndex - 1) * @pageSize+ 1) and (@pageIndex * @pageSize)endgo-- 调用过程:sp_scorepageDECLARE @rowcount int, -- 声明输出参数@pagecount intEXEC [dbo].[sp_scorepage]@pageIndex = 1, -- 页码@pageSize = 5, -- 每页大小@rowcount = @rowcount OUTPUT, -- 总行数@pagecount = @pagecount OUTPUT -- 总页数SELECT @rowcount as '总行数',@pagecount as '总页数'GO
文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




