sql实现分页,Sql 分页
使用sql语句实现分页查询
使用sql语句在语句末尾添加 limit page,count //意思是 获取从page+1开始的count条记录
例如:select * from checkmoney where phonenumber='18209183861' order by check_start_time desc limit 1,5;
这条语句获取了 checkmoney的第 2条至第6条 记录。
SQL分页的几种方法
方法一 使用offset fetch next(2012版本及以上版本才可以使用)
方法二 使用row_number()函数
利用row_number() over(order by id desc)函数计算出行数,选定相应的行数返回即可(2005版本以上才可以使用)
使用存储过程封装
几种常见SQL分页方式
create?table?pagetest
(
id?int?identity(1,1)?not?null,
col01?int?null,
col02?nvarchar(50)?null,
col03?datetime?null
)
--分页1,not?in/top
select?top?50?*?from?pagetest
where?id?not?in?(select?top?9900?id?from?pagetest?order?by?id)
order?by?id
?
--分页2,not?exists
select?top?50?*?from?pagetest
where?not?exists
(select?1?from?(select?top?9900?id?from?pagetest?order?by?id)a??where?a.id=pagetest.id)
order?by?id
?
--写法3,max/top
select?top?50?*?from?pagetest
where?id(select?max(id)?from?(select?top?9900?id?from?pagetest?order?by?id)a)
order?by?id
?
--分页4,row_number()
select?top?50?*?from
(select?row_number()over(order?by?id)rownumber,*?from?pagetest)a
where?rownumber9900
?
select?*?from
(select?row_number()over(order?by?id)rownumber,*?from?pagetest)a
where?rownumber9900?and?rownumber9951
?
select?*?from
(select?row_number()over(order?by?id)rownumber,*?from?pagetest)a
where?rownumber?between?9901?and?9950
?
--分页5,在csdn上一帖子看到的,row_number()?变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select?*
from?(
????select?row_number()over(order?by?tempColumn)rownumber,*
????from?(select?top?9950?tempColumn=0,*?from?pagetest?where?1=1?order?by?id)a
)b
where?rownumber9900
结论:
1.max/top,ROW_NUMBER()都是比较不错的分页方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同时适用于sql2000,access。
2.not exists感觉是要比not in效率高一点点。
3.ROW_NUMBER()的3种不同写法效率看起来差不多。
4.ROW_NUMBER() 的变体基于这个测试效率实在不好。