数据库分页

1)前言:数据库分页,是一个常用重要的业务需要,实现的SQL方式有多种,需要了解不同的方式有何不同,更需要知道每一种的效率,若数据量很大时,效率是很重要的。

注:本文,以后会根据不同类型数据库和不同版本,进行内容扩展。

 

2)正文实战

2.1)数据库类型:SQL SERVER2008

2.1.1)方法一

思路:通过top表主键ID配合,达到分页效果;

代码:

select top 10 * from pubDept
--通过not in将前面10条数据过滤,再重新获取后面最前的10,以达到分页,
--不过前提都是他们的排序方式一致
where DeptID not in (select top 10 DeptID from pubDept)
order by DeptID;

效果,图1:

分析:从SQL中容易看出,它遍历同一个表pubDept两次,即查了两次,效率和性能肯定是不好的,效率随数据量的增大而降低。

 

2.1.2)方法二

思路:通过top表主键ID,和max函数配合,达到分页(可能由于ID是递增数字,所以可用max);

代码:

select top 10 * from pubDept
--通过对比前10条数据的主键ID最大值,过滤掉前10条数据,达到分页
where DeptID > 
--将前10条数据的主键ID获取到,并且将主键ID最大值筛出
(select max(t.DeptID) from (select top 10 DeptID from pubDept ORDER BY DeptID) t)
ORDER BY DeptID;

效果,如图一;

分析:

先取出前10条数据的主键,然后取出主键的最大值,再从数据里面取出 大于 前10条主键的最大值 的前10条数据。

缺点是性能比较差,跟方法一差不多。

 

2.1.3)方法三(SQL SERVER2005新增的方法,SQL SERVER2005后的版本,都可用)

思路:通过row_number()函数,达到分页;

代码:

select * from 
(select *,row_number() over(ORDER BY DeptId) rowId from pubDept) t
where rowId between 11 and 20;

分析:性能比前两种方法要好,只会遍历一次所有的数据(SQL SERVER2000不支持)

效果,如图一

 

2.1.4)方法四(SQL SERVER2008之后的版本,不包含SQL SERVER2008)

思路:暂无

代码:

select * from  pubDept
order by DeptId
offset 5*2 rows fetch next 5 rows only;

效果:(在SQL SERVER2008下执行,报错,不支持该方式)

 

代码:

select * from  vKJ_EmployeeInfoList
order by cardId
offset 5*2 rows fetch next 5 rows only;

效果,图2:(在SQL SERVER2016中执行,完美执行)

 

本文参考:SQL Server 数据分页查询

若有不足,请指正,感谢!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值