SQL Server分页查询
查询第n到第m条记录
方法一(简洁):
-- 从表[demo].[dbo].[demo]中取出第n到第m条记录
SELECT TOP m-n+1 *
FROM [demo].[dbo].[demo]
WHERE id NOT IN (
SELECT TOP n-1 id
FROM [demo].[dbo].[demo]
)
方法二(效率更高):
-- 从表[demo].[dbo].[demo]中取出第n到第m条记录
SELECT TOP m-n+1 *
FROM [demo].[dbo].[demo]
WHERE id > (
SELECT MAX(id)
FROM (
SELECT TOP n-1 id
FROM [demo].[dbo].[demo]
ORDER BY id
) T
)
ORDER BY id
----警告!!!
----此查询方法有错,当n=1时查不到数据
应改为:
SELECT TOP m-n+1 *
FROM [demo].[dbo].[demo]
WHERE id >= (
SELECT MAX(id)
FROM (
SELECT TOP n id
FROM [demo].[dbo].[demo]
ORDER BY id
) T
)
ORDER BY id
--于2018/10/29更新 张岩
注:查询时可尽可能多的使用“TOP”关键字,可显著提高查询效率
在数据量比较大时切勿用方法一
完整的测试数据在这:
------------- 数据初始化 ----------------
declare @i int
set @i=0
while @i<110010
begin
insert into [demo].[dbo].[demo](name,name2,bz) values('第n行','第n行','n')
set @i+=1
end
-------- 测试表总数据量为110010条 -----------
-------------- 方法二(高效率的方法) ---------------------
declare @PageSize int --页大小
declare @PageIndex int --页码数
declare @date datetime --记录SQL执行时间
set @PageSize=50
set @PageIndex=1990
set @date=GETDATE()
begin
SELECT TOP (@PageSize) *
FROM [demo].[dbo].[demo]
WHERE id > (
SELECT MAX(id)
FROM (
SELECT TOP (@PageSize*(@PageIndex-1)) id
FROM [demo].[dbo].[demo]
ORDER BY id
) T
)
ORDER BY id
set @i+=1
end
select GETDATE()-@date
--------------------- 平均用时37毫秒 -----------------------
---警告!!!
---方法二有错,当查询页码为第一页时无法查出来数据
---应该为:
declare @PageSize int --页大小
declare @PageIndex int --页码数
set @PageSize=50
set @PageIndex=1990
SELECT TOP (@PageSize) *
FROM [demo].[dbo].[demo]
WHERE id >= (
SELECT MAX(id)
FROM (
SELECT TOP (@PageSize*(@PageIndex-1)+1) id
FROM [demo].[dbo].[demo]
ORDER BY id
) T
)
ORDER BY id
----于2018/10/29更新 张岩
-----------------------------------------------------------------------------
------------------ 方法一(大数据量时效率较低) -----------------------
declare @PageSize int --页大小
declare @PageIndex int --页码数
declare @date datetime --记录执行时间
set @PageSize=50
set @PageIndex=1990
set @date=GETDATE()
begin
SELECT TOP (@PageSize) *
FROM [demo].[dbo].[demo]
WHERE (id NOT IN
(SELECT TOP (@PageSize*(@PageIndex-1)) id
FROM [demo].[dbo].[demo])
)
ORDER BY id
end
select GETDATE()-@date
--------------------- 平均用时3分30秒 -----------------------
推荐文章:http://www.cnblogs.com/hyd1213126/p/5828937.html