SQL server分页的4种方法示例- 备案查询工具-很全面
这篇文章主要给我们介绍了关于SQL server分页的4种办法备案查询工具,文中经过示例代码介绍的非常详细,对我们的学习或许作业具有一定的参阅学习价值,需要的朋友们下面跟着小编来一同学习学习吧
这篇博客讲的是SQL server的分页办法,用的SQL server 2012版别。下面都用pageIndex表明页数,pageSize表明一页包括的记载。而且下面涉及到详细比如的,设定查询第2页,每页含10条记载。
首先说一下SQL server的分页与MySQL的分页的不同,mysql的分页直接是用limit (pageIndex-1),pageSize就能够完结,可是SQL server 并没有limit关键字,只要类似limit的top关键字。所以分页起来比较费事。
SQL server分页我所知道的就只要四种:三重循环;使用max(主键);使用row_number关键字,offset/fetch next关键字(是经过搜集网上的其他人的办法总结的,应该现在只要这四种办法的思路,其他办法都是基于此变形的)。
要查询的学生表的部分记载
办法一:三重循环 思路
先取前20页,然后倒序,取倒序后前10条记载,这样就能得到分页所需要的数据,不过次序反了,之后能够将再倒序回来,也能够不再排序了,直接交给前端排序。
还有一种办法也算是归于这种类型的,这儿就不放代码出来了,只讲一下思路,便是先查询出前10条记载,然后用not in排除了这10条,再查询。
代码完成
— 设置履行时间开端,用来检查功能的
set statistics time on ;
— 分页查询(通用型)
select *
from (select top pageSize *
from (select top (pageIndex*pageSize) *
from student
order by sNo asc ) — 其间里边这层,有必要指定依照升序排序,省掉的话,查询出的成果是过错的。
as temp_sum_student
order by sNo desc ) temp_order
order by sNo asc
— 分页查询第2页,每页有10条记载
select *
from (select top 10 *
from (select top 20 *
from student
order by sNo asc ) — 其间里边这层,有必要指定依照升序排序,省掉的话,查询出的成果是过错的。
as temp_sum_student
order by sNo desc ) temp_order
order by sNo asc
;
查询出的成果及时间
办法二:使用max(主键)
先top前11条行记载,然后使用max(id)得到最大的id,之后再从头再这个表查询前10条,不过要加上条件,where id>max(id)。
代码完成
set statistics time on;
— 分页查询(通用型)
select top pageSize *
from student
where sNo>=
(select max(sNo)
from (select top ((pageIndex-1)*pageSize+1) sNo
from student
order by sNo asc) temp_max_ids)
order by sNo;
— 分页查询第2页,每页有10条记载
select top 10 *
from student
where sNo>=
(select max(sNo)
from (select top 11 sNo
from student
order by sNo asc) temp_max_ids)
order by sNo;
查询出的成果及时间
办法三:使用row_number关键字
直接使用 row_number() over(order by id) 函数计算出行数,选定相应行数返回即可,不过该关键字只要在SQL server 2005版别以上才有。
SQL完成
set statistics time on;
— 分页查询(通用型)
select top pageSize *
from (select row_number()
over(order by sno asc) as rownumber,*
from student) temp_row
where rownumber>((pageIndex-1)*pageSize);
set statistics time on;
— 分页查询第2页,每页有10条记载
select top 10 *
from (select row_number()
over(order by sno asc) as rownumber,*
from student) temp_row
where rownumber>10;
查询出的成果及时间
第四种办法:offset /fetch next(2012版别及以上才有)
代码完成
set statistics time on;
— 分页查询(通用型)
select * from student
order by sno
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;
— 分页查询第2页,每页有10条记载
select * from student
order by sno
offset 10 rows
fetch next 10 rows only ;
offset A rows ,将前A条记载舍去,fetch next B rows only ,向后在读取B条数据。
成果及运行时间
封装的存储进程
最终,我封装了一个分页的存储进程,方便我们调用,这样到时分写分页的时分,直接调用这个存储进程就能够了。
分页的存储进程
create procedure paging_procedure
( @pageIndex int, — 第几页
@pageSize int — 每页包括的记载数
)
as
begin
select top (select @pageSize) * — 这儿留意一下,不能直接把变量放在这儿,要用select
from (select row_number() over(order by sno) as rownumber,*
from student) temp_row
where rownumber>(@pageIndex-1)*@pageSize;
end
— 到时分直接调用就能够了,履行如下的句子进行调用分页的存储进程
exec paging_procedure @pageIndex=2,@pageSize=10;
总结
根据以上四种分页的办法履行的时间能够知道,以上四种分页办法中,第二,第三,第三四种办法功能是差不多的,可是第一种功能很差,不引荐使用。还有便是这篇博客这是测试了小量数据,还没有分页很多数据,所以不清楚在很多数据要分页时哪种办法的功能更加好。我这儿引荐第四种,究竟第四种是SQL server公司晋级后推出的新办法,所以应该理论上功能和可读性都会更加好。
共有 0 条评论