SQL Server分页查询

1 篇文章 0 订阅
1 篇文章 0 订阅

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

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值