方式1:
  假设页数是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条元素

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

select top 10 *
from test
where 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
) A
where 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 int
AS
declare @temp int
set @temp=@pageSize*(@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  pageDemo 10,5

【SqlServer】解析SqlServer的分页的更多相关文章

  1. 您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗?

    您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗? 介绍 假如你有50台服务器需要安装SQLSERVER,如果你用下一步下一步的方式,用远程桌面不停切换,那个效率... 大家 ...

  2. 自动化安装SQLSERVER和SQLSERVER补丁 转

    2014-01-23 18:31  您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗? 介绍 假如你有50台服务器需要安装SQLSERVER,如果你用下一步下一步的方式,用远 ...

  3. Asp 解析 XML并分页显示

    Asp 解析 XML并分页显示 Asp 解析 XML并分页显示,演示样例源代码例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  4. SQLServer解析xml到Oracle

    写了一个程序:根据状态位读取SQLserver 中的一张表,下载其中一个字段的值,这个值是XML类型的,然后把这个XML文件的内容插入到另一Oracle数据库,并更新SQLServer表的标志位,表示 ...

  5. 【SqlServer】解析SqlServer中的事务

    目录结构: contents structure [+] 事务是什么 控制事务 数据并发访问产生的影响 事务的隔离级别 锁 NOLOCK.HOLDLOCK.UPDLOCK 死锁分析 在这篇Blog中, ...

  6. mysql / sqlserver / oracle 常见数据库分页

    空闲时间里用着mysql学习开发测试平台和测试用具, 在公司里将可用的测试平台部署,将数据库换成sqlserver 巴望着能去用oracle的公司 mysql中的分页 limit是mysql的语法se ...

  7. oracle mysql sqlserver数据库中的分页

    oracle: select * from (select rownum r,t1.* from tablename t1 where rownum <M+N ) t2 where t2.r&g ...

  8. sqlserver的四种分页方式

    第一种:ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId f ...

  9. 【.Net+数据库】sqlserver的四种分页方式

    第一种:ROW_NUMBER() OVER()方式 select * from (  select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId ...

随机推荐

  1. webpack 使用环境变量

    要在开发和生产构建之间,消除 webpack.config.js 的差异.你可能需要环境变量. 可以使用 Node.js 模块的标准方式:在运行 webpack 时设置环境变量,并且使用 Node.j ...

  2. AndroidStudio将html5打包成apk

    我想将html5的动画效果打包成手机app,以方便传播.而在android开发的组件中就直接由webview可以访问网页,另外在android工程中,assets文件夹下的内容是不会在被编译的,因此可 ...

  3. python全栈开发day21面向对象初识总结

  4. BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1150 题意概括 数轴上面有一堆数字. 取出两个数字的代价是他们的距离. 现在要取出k对数,(一个数 ...

  5. C#资源管理器

    窗体搭建:ContextMenuStrip右键菜单,Treeview树形菜单,Listview控件 新建"我的文件"类: public class MyFile { public ...

  6. HDU 2594 (next数组的用法)【KMP】

    <题目链接> 题目大意: 给两个字符串,求第一串的前缀与第二串的后缀匹配的最长序列以及长度. 解题分析: 看到这个求前缀和后缀相同序列的最大长度,我们不难想到KMP中的next数组.做法就 ...

  7. hdu1003 Max Sum【最大连续子序列之和】

    题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实 ...

  8. [CodeForces-1036E] Covered Points 暴力 GCD 求交点

    题意: 在二维平面上给出n条不共线的线段,问这些线段总共覆盖到了多少个整数点 解法: 用GCD可求得一条线段覆盖了多少整数点,然后暴力枚举线段,求交点,对于相应的 整数交点,结果-1即可 #inclu ...

  9. Springboot 2.0.x 集成基于Centos7的Redis集群安装及配置

    Redis简介 Redis是一个基于C语言开发的开源(BSD许可),开源高性能的高级内存数据结构存储,用作数据库.缓存和消息代理.它支持数据结构,如 字符串.散列.列表.集合,带有范围查询的排序集,位 ...

  10. go语言学习-接口

    Go语言中虽然没有传统面向对象语言中类.集成的概念,不过提供了接口的支持,可以使用接口来使用一些面向对象的特性. 在 go 语言中,的接口有下面几个特点: 可以包含0个或多个方法的签名 只定义方法的签 ...