博客
关于我
【SqlServer】解析SqlServer的分页
阅读量:404 次
发布时间:2019-03-05

本文共 1470 字,大约阅读时间需要 4 分钟。

方式1:

  假设页数是10,现在要拿出第5页的内容,查询语句如下:
  --10代表分页的大小

select top 10 *from testwhere 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条元素

方式2:
  还是以上面的结果为例,采用另外的一种方法
  --数据的意思和上面提及的一样

select top 10 *from testwhere id >( select is null(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类型的。

 方式3:

select *    from    (        select *,row_number() over(order by id) as rownumber,* from test    ) Awhere rownumber > 40 and  rownumber<=50;

   原理:先把表中的所有数据都按照一个rowNumber进行排序,然后查询rownuber大于40的前十条记录。

  这种方法和oracle中的一种分页方式类似,不过只支持2005版本以上的

 方式4:

  这种方式更加简便,和好理解。

SELECT * FROM TestTable order by id offset 40 ROWS FETCH NEXT 10 ROWS only

 

 

这里对这四种方式做一下分析,

第一种方式在查询的数据量很大的时候,性能会比较差。

第二种方式中,如果id是一个IDENTITY (1,1)类型的数据话,那么上面那种查询语句就可以进行如下优化:

select * from test where id>@page-1 and id<=@page-1+@pageSize

当然最好的情况是给id建立聚集索引,效果最好。如果表中没有这样的字段,那么推荐使用第三种方式。

第三种方式,这种方式首先是通过row_number对查询出来的列进行编号,然后再通过列进行选取数据,如果表非常大的话,那么进行编号的过程将会比较吃力。

第四种方式,这种方式比较好写,从上面可以看出,offset是对id起作用的,所以必须要有 order by id ,或者 order by 其它字段 也可以。

 接下创建一个存储过程:

  存储过程查询   创建存储过程alter procedure pageDemo@pageSize int,@page intASdeclare @temp intset @temp=@pageSize*(@page - 1)begin select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by idend

执行存储过程

exec  pageDemo 10,5

 

转载地址:http://cehzz.baihongyu.com/

你可能感兴趣的文章
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
mysql 将null转代为0
查看>>
mysql 常用
查看>>
MySQL 常用列类型
查看>>
mysql 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>