sqlServer如何实现分页查询
创始人
2024-02-08 03:03:01

sqlServer的分页查询和mysql语句不一样,有三种实现方式。分别是:offset /fetch next、利用max(主键)、利用row_number关键字

一、offset /fetch next关键字

2012版本及以上才有,SQL server公司升级后推出的新方法。
公式:

-- 分页查询公式-offset /fetch next
select * from 表名
order by 主键 或 其他索引列 
-- @pageIndex:页码、@pageSize:每页记录数
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;

示例:

-- 分页查询第2页,每页有10条记录
select * from tb_user
order by uid
offset 10 rows
fetch next 10 rows only ;

说明:
offset 10 rows ,将前10条记录舍去,fetch next 10 rows only ,向后再读取10条数据。

二、利用max(主键)

公式:

-- 分页查询公式-利用max(主键)
select top @pageSize * 
from 表名 
where 主键>=
(select max(主键) from (select top ((@pageIndex-1)*@pageSize+1) 主键from 表名  order by  主键 asc) temp_max_ids) 
order by 主键;

示例:

-- 分页查询第2页,每页有10条记录
select top 10 * 
from tb_user 
-- 3、再重新在这个表查询前10条,条件: id>=max(id)
where uid>=
-- 2、利用max(id)得到前11条记录中最大的id
(select max(uid) from (-- 1、先top前11条行记录select top 11 uidfrom tb_user order by  uid asc) temp_max_ids) 
order by uid;

说明:
先top前11条行记录,然后利用max(id)得到最大的id,之后再重新在这个表查询前10条,不过要加上条件,where id>=max(id)。

中心思想:其实就是先得到该页的初始id,PS:别忘了加上排序哦

三、利用row_number关键字

这种方式也是比较常用的,直接利用row_number() over(order by id)函数计算出行数,选定相应行数返回即可,不过该关键字只有在SQL server 2005版本以上才有。
公式:

-- 分页查询公式-row_number()
select top @pageSize * 
from (-- rownumber是别名,可按自己习惯取select row_number() over(order by 主键 asc) as rownumber,* from 表名) temp_row
where rownumber>((@pageIndex-1)*@pageSize);

示例:

-- 分页查询第2页,每页有10条记录
select top 10 * 
from (-- 子查询,多加一个rownumber列返回select row_number() over(order by uid asc) as rownumber,* from tb_user) temp_row--限制起始行标
where rownumber>10;

说明:
利用row_number函数给每行记录标了一个序号,相当于在原表中多加了1列返回。
上述示例,是以序号11为起始行,查询前10条记录,即为第2页数据。
在这里插入图片描述

优化:
可以看到,子查询查询了全表数据,如果数据量大,效率是比较低的。
下面是优化后的SQL,
公式:

-- 分页查询公式-row_number()-优化版本
select * 
from (-- rownumber是别名,可按自己习惯取select top (@pageIndex*@pageSize) row_number() over(order by 主键 asc) as rownumber,* from 表名) temp_row
where rownumber>((@pageIndex-1)*@pageSize);

示例:

-- 分页查询第2页,每页有10条记录
select * 
from (-- 子查询,限制了返回前20条数据select top 20 row_number() over(order by uid asc) as rownumber,* from tb_user) temp_row--限制起始行标
where rownumber>10;

说明:
这里,子查询仅查询到当前页的最后一行,没有进行全表查询,所以效率上要快一点。在外层限制起始行标,是没变的,但是却在内层控制了结尾行标。
上述示例,是以序号11为起始行,查询20以内的记录,即为第2页数据。

更多介绍,可查看我的另外篇文章:SQL Server中row_number函数用法介绍

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...