友情提示:本文共有 1516 个字,阅读大概需要 4 分钟。
些方法适用于SQL SERVER2012及以后版本
示例:
有如下一个数据表,一共35条数据,
如果要取区间11-20条的记录,按学号排序,注意:如果没有自动编号字段,务必找数据没有重复的字段排序,比如身份证号,手机号等,如果找不到单个不重复的字段,那么可以多字段排序以保不影响查询结果。例如:
select * from [18年考试成绩] order by [姓名] asc,[学号] asc offset 10 rows fetch next 10 rows only
这语句的意思是以字段“姓名”升序为第一排序,“学号”字段升序为第二排序,(一般情况下学号是不复复的字段,直接使用学号做排序就可以,无需要多个排序字段,这里只是演示说明,必要时可以多字段排序)
offset 10 rows的意思是从开始往下移动10行,fetch next 10 rows only意思从下一行开始获取10行的记录数据,就是获取11-20条记录。
如果要实现分页显示,需要把offset数值和next数值代入变量就可以了
首先要获取数据表的总记录数
select count(姓名) as 总记录数 from [18年考试成绩]
本例中如果设定每页显示8条数据,那么一共需要5页,在计算页数的时候有一个要注意的问题,如果字段为整数型小数是会自动舍去,无法获取正常的页数,比如count(姓名)获得总记录数,再除以8显示的结果是4,实际应该是35/8=4.375,为了防止掉入这些坑,应该在count(姓名)后面乘一个带小数的1.0。
select count(姓名)*1.0/8 as 分页总数 from [18年考试成绩],这样将能得到完整的小数
然后再使用SQL向上取整函数Ceiling,得到需要的总页数
select Ceiling(count(姓名)*1.0/8) as 分页总数 from [18年考试成绩]
知道了总记录数,设置好每页显示的记录数,得出了总页数,这样就可以实现完整的分页显示功能了
显示指定页:
select * from [18年考试成绩] order by [姓名] offset 每页显示的数量的变量*(要显示的页数的变量-1) rows fetch next 每页显示的数量的变量 rows only
如本例,要显示第3页的8条数据
select * from [18年考试成绩] order by [姓名] offset 8*(3-1) rows fetch next 8 rows only
显示第一页除了可以使用上面的方法也可以直接使用TOP方法
select top 8 * from [18年考试成绩] order by [姓名]
select * from [18年考试成绩] order by [姓名] offset 8*(1-1) rows fetch next 8 rows only
上面两条语句都可以直接显示第一页
显示最后一页也是直接使用指定页的方法就可以,只需要把要显示的页数直接设置为总页数
select * from [18年考试成绩] order by [姓名] offset 每页显示的数量的变量*(总页数的变量-1) rows fetch next 每页显示的数量的变量 rows only
如本例,显示最后一页
select * from [18年考试成绩] order by [姓名] offset 8*(5-1) rows fetch next 8 rows only
上一页和下一页都直接把要显示的页数变量加减1就可以了,但在这之前要加一个判断,当前是不是已经是第一页或最后一页,根据变量的所在页变量判断就可以了。
本文如果对你有帮助,请点赞收藏《SQL SERVER读取指定区间数据 实现高效分页语句》,同时在此感谢原作者。