SQL分页语句

有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标。本人不喜欢使用游标,我觉得它耗资、效率低;使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活。先看看单条 SQL 语句的分页 SQL 吧。

方法1:
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
          (
          
SELECT TOP 页大小*(-1) id FROM table1 ORDER BY id
          )
ORDER BY id

方法2:
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id >
          (
          
SELECT ISNULL(MAX(id),0
          FROM 
                (
               
SELECT TOP 页大小*(-1) id FROM table1 ORDER BY id
                ) 
A
          )
ORDER BY id

方法3:
适用于 SQL Server 2005

SELECT TOP 页大小 * 
FROM 
        (
        
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
        ) A
WHERE RowNumber > 页大小*(页数-1)


说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。

 

 

 

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

posted @ 2009-01-02 22:41 金鱼 阅读(25954) 评论(18) 编辑 收藏

 回复 引用 查看   
#1楼2009-03-25 11:24 | vistang      
楼主,帮帮忙,如果想把数据按照DESC排序该怎么弄?
 回复 引用 查看   
#2楼[楼主]2009-04-08 15:18 | 金鱼      
@vistang
直接在where后面加条件就可以了吧!

 回复 引用   
#3楼2009-06-13 11:59 | 电子商务人才[未注册用户]
有没有在查询结果集里排序的分页sql?
 回复 引用   
#4楼2009-06-13 12:00 | 电子商务人才[未注册用户]
即使在sql08,排序分页用row_number也见慢。
 回复 引用 查看   
#5楼2009-10-28 09:16 | 冬夜的流萤      
haha
 回复 引用 查看   
#6楼2009-11-18 10:44 | 胖哥      
好文章
 回复 引用 查看   
#7楼2010-10-02 23:02 | fuck103594223      
晕了,这么菜的分页居然也有人追捧,哈哈,看来SQL大菜鸟真多哦
 回复 引用 查看   
#8楼2011-01-15 23:29 | dzry      
敢问博主第三个是怎么用到游标和存储过程的?
 回复 引用 查看   
#9楼2011-04-06 11:02 | huyong      
谢谢
 回复 引用 查看   
#10楼2011-04-06 11:03 | huyong      
引用fuck103594223:晕了,这么菜的分页居然也有人追捧,哈哈,看来SQL大菜鸟真多哦

请问你有什么好的想法?

 回复 引用 查看   
#11楼2011-05-23 12:39 | Mort_1990      
恩,还不错。呵呵
 回复 引用 查看   
#12楼2011-06-20 13:07 | 秦时 明月      
楼主要是不是主键不是ID呢?是guid怎么办?
 回复 引用 查看   
#13楼2011-07-14 10:02 | flay      
头两个效率太慢
 回复 引用 查看   
#14楼2011-10-20 11:03 | xing_sky      
很不错的学习资料,谢谢。。
 回复 引用 查看   
#15楼2011-11-02 09:21 | love begins coding      
没有id...怎么分页
 回复 引用 查看   
#16楼2011-11-08 10:27 | 吾不知鱼      
感谢博主,从这些分页方法中受到很大启发。不过如果按DESC来排序时,页大小*(页数-1)的计算方式就有点问题了。如果这样写: 页大小*(页数-1) + 1,则顺序降序的差别都不会太大,便于拼接SQL语句:

顺序写法:
SELECT TOP 页大小 *
FROM table1
WHERE id >=
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1)+1 id FROM table1 ORDER BY id
) A
)
ORDER BY id

降序写法:
SELECT TOP 页大小 *
FROM table1
WHERE id <=
(
SELECT ISNULL(MIN(id),0)
FROM
(
SELECT TOP 页大小*(页数-1)+1 id FROM table1 ORDER BY id Desc
) A
)
ORDER BY id Desc

 回复 引用 查看   
#17楼2012-01-14 14:44 | lovestory      
学习一下。。感觉很好。。不知道扩展好不好
 回复 引用 查看   
#18楼2012-01-19 14:02 | 你猜一猜      
引用dzry:敢问博主第三个是怎么用到游标和存储过程的?


复制错了了知道吗

自己不测试一下 不要拿出来误导人好不好