千家信息网

SQL server有哪些分页方法

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,这篇文章主要讲解了"SQL server有哪些分页方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SQL server有哪些分页方法"吧!这篇讲的是
千家信息网最后更新 2024年11月12日SQL server有哪些分页方法

这篇文章主要讲解了"SQL server有哪些分页方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SQL server有哪些分页方法"吧!

这篇讲的是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_orderorder 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_orderorder 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) sNofrom 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 sNofrom 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_rowwhere 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_rowwhere rownumber>10;
查询出的结果及时间

第四种方法:offset /fetch next(2012版本及以上才有)

代码实现
set statistics time on;-- 分页查询(通用型)select * from studentorder by sno offset ((@pageIndex-1)*@pageSize) rowsfetch next @pageSize rows only;-- 分页查询第2页,每页有10条记录select * from studentorder by sno  offset 10 rowsfetch next 10 rows only ;

offset A rows ,将前A条记录舍去,fetch next B rows only ,向后在读取B条数据。

结果及运行时间

封装的存储过程

最后,我封装了一个分页的存储过程,方便大家调用,这样到时候写分页的时候,直接调用这个存储过程就可以了。

分页的存储过程

create procedure paging_procedure(       @pageIndex int, -- 第几页        @pageSize int  -- 每页包含的记录数)asbegin         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公司升级后推出的新方法,所以应该理论上性能和可读性都会更加好。

感谢各位的阅读,以上就是"SQL server有哪些分页方法"的内容了,经过本文的学习后,相信大家对SQL server有哪些分页方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 查询 关键 关键字 时间 结果 性能 数据 过程 存储 代码 只有 思路 通用型 排序 倒序 就是 版本 学习 到时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 暗箭网络安全 图书管理系统的数据库代码 代码 管理 服务器 网络安全知识答题简报 尔雅数据库技术答案 企业如何落实网络安全主体责任 医疗大健康数据库技术与应用 如果软件开发者离职了 数据库事务的原子性怎么保证 鸿蒙系统服务器是安卓的服务器吗 上海网络技术员 vb精简版6.0可以数据库 杭州网络安全准入控制系统多少钱 数据库课程设计的物理设计 软件开发承包app是做什么的 服务器主板没有显卡怎么用 才子网络科技crm数据库 上位机软件开发师招聘 怎么查看数据库创建语句 软件开发运营需要多少钱 车贷贷款软件开发 上海信息软件开发服务要多少钱 R星服务器被黑了 备份数据库和分离数据库有何区别 vb精简版6.0可以数据库 软件开发技术跟业务的区别 mt 4手机版登录服务器 中小企业 网络安全 指南 软件开发需求的分层 数据库中返回字符串长度的函数是
0