SQL分页查询

SQLServer 的数据分页:

假设现在有这样的一张表:
CREATE TABLE test
(
 id int primary key not null identity,
 names varchar(20)
)
然后向里面插入大约1000条数据,进行分页测试
假设页数是10,现在要拿出第5页的内容,查询语句如下:
--10代表分页的大小
select top 10 *
from test
where id not in
(
 --40是这么计算出来的:10*(5-1)
 select top 40 id from test order by id
)
order by id
原理:需要拿出数据库的第5页,就是40-50条记录。首先拿出数据库中的前40条记录的id值,然后再拿出剩余部分的前10条元素

第二种方法:
还是以上面的结果为例,采用另外的一种方法
--数据的意思和上面提及的一样
select top 10 *
from test
where id >
(
 select isnull(max(id),0)
 from
  (
   select top 40 id from test order by id
  ) A
)
order by id
原理:先查询前40条记录,然后获得其最id值,如果id值为null的,那么就返回0
然后查询id值大于前40条记录的最大id值的记录。
这个查询有一个条件,就是id必须是int类型的。

第三种方法:
select top 10 *
from
(
 select row_number() over(order by id) as rownumber,* from test
) A
where rownumber > 40
原理:先把表中的所有数据都按照一个rowNumber进行排序,然后查询rownuber大于40的前十条记录
这种方法和oracle中的一种分页方式类似,不过只支持2005版本以上的

第四种:
存储过程查询
创建存储过程
alter procedure pageDemo
@pageSize int,
@page int
AS
declare @temp int
set @[email protected]*(@page - 1)
begin
 select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id
end
执行存储过程
exec 10,5

  

时间: 2024-12-14 14:02:14

SQL分页查询的相关文章

SQL分页查询总结{转}

开发过程中经常遇到分页的需求,今天在此总结一下吧.简单说来方法有两种,一种在源上控制,一种在端上控制.源上控制把分页逻辑放在SQL层:端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridView).显然,端上控制开发难度低,适于小规模数据,但数据量增大时性能和IO消耗无法接受:源上控制在性能和开发难度上较为平衡,适应大多数业务场景:除此之外,还可以根据客观情况(性能要求,源与端的资源占用等)在源和端之间加一层,应用特殊算法和技术进行处理.以下主要讨论源上,即SQL上的分页.分页的问题其实

SQL分页查询结果不一致

今天遇到了SQL分页查询结果不一致的情况,一看代码,原来是没加排序查询!!分页查询最好加排序,且以唯一性高的字段进行排序,如ID,时间等,以保持每页查询结果的准确! PS:又帮别人擦屁股!!

sql 分页查询

数据过多时sql中返回数据,开销大,用户还不一定会用到.这时使用sql分页查询,更具用户操作返回对应的数据就能极大程度提高效率. 分页有多种方法:top in.exist.row_number()等,在此只叙述相对高效的 max/top  分页方式 1.原始的 select * from dbo.pagetest where id >(select max(id) from (select top(9900) id from dbo.pagetest order by id)a) order b

SQL分页查询,纯Top方式和row_number()解析函数的使用及区别

听同事分享几种数据库的分页查询,自己感觉,还是需要整理一下MS SqlSever的分页查询的. Sql Sever 2005之前版本: select top 页大小 * from 表名 where id not in ( select top 页大小*(查询第几页-1) id from 表名 order by id ) order by id 例如: select top 10 * --10 为页大小 from [TCCLine].[dbo].[CLine_CommonImage] where

【原创】SQL分页查询存储过程

1 ------------------------------------- 2 -----作者:张欣宇 3 -----时间:2013-06-28 4 -----简介:根据参数和条件分页查询 5 ------------------------------------- 6 Create proc [dbo].[Up_PagingQueryByParameter] 7 ( 8 ----- 表名或能查询到结果的SQL语句{SQL语句左右必须有括号例:(select * from tbl1)} 9

SQL分页查询的几种方式

需求:查询表dbo.Message,每页10条,查询第2页 1:TOP() SELECT TOP(20) * FROM dbo.Message WHERE Code NOT IN (SELECT TOP(10) Code FROM dbo.Message) 2:BETWEEN *  AND *  ,  Row_Number() OVER(ORDER BY *) AS rowNum SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #

SQL 分页查询的四种方法

方法一 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names varchar(20) ) 然后向里面插入大约100条数据,进行分页测试 假设页数是10,现在要拿出第5页的内容,查询语句如下: --10代表分页的大小 select top 10 * from test where id not in ( --40是这么计算出来的:10*(5-1) select top 40 id from test

sql 分页查询 (每次6行 )

--  对比 数据 是否 相同 select * from [dbo].[ProjecrInfo] where Project_state='已审核' -- 查询 已经 审核 有多少数据 -- 每次 按照 6行查询    第一个 6 是 每次 显示 6行数 据  可以改  成 你想 每次按照 几行查询    第二个 数字是 分页select top 6 * from ProjecrInfo where ProjectID not in (select top 12 ProjectID from

Sql 分页查询效率分析

选取了2中效率比较高的方式比较效率:row_Number() .offset fetch 表test中有1000条数据,2个字段:field1(int),field2(nvarchar) --1000条数据,查询500次第1-10行,39s --1000条数据,查询500次第500-550行,87s --1000条数据,查询500次第150-160行,88s DECLARE @uId int SET @uId=1 BEGIN while @uId<=500 BEGIN SELECT * FROM