SQL Server SQL分页查询
SQL Server SQL分页查询的几种方式
目录
- 0.序言
总结一下SQL Server种常用的几种分页查询:
本示例中用的时已有的表,建表不规范,Name作为主键,建议实际使用中专门设置主键并且WHERE条件中尽可能使用主键。
参数说明:
@pageSize:分页查询每页N条数据时每页期望的数据量N
@offset:分页查询第I页每页N条数据时,第I页之前的N*(I-1)条数据
举个栗子:假如我们要查询第3页的数据,每页10条数据,则 @pageSize为10,@offset为20。
基本原理:查询 @pageSize 条数据,先使用一个子查询查询出符合查询条件的 @offset条数据的主键,再使用TOP @pageSize查询@pageSize条数据,并且再WHERE从句中使用 NOT IN 关键词来对数据进行筛选。

基本原理:在SQL Server2005之后加入,可以使用 ROW_NUMBER()函数为查询出来的记录生成一个行号,需要指定一个ORDER BY 子句确定排序方式,排序方式不同,行号也可能不同。详细说明:ROW_NUMBER()

本文只涉及OVER从句中跟随ORDER BY子句,partition by 从句不在本文讨论范围内,partition by 和OVER详细说明戳这里

这里使用了两个ROW_NUMBER()函数的例子,这两个计算总行数的方式是不一样的,本文结尾处会对比一个两种方式的IO操作以说明哪种方式更适合
OFFSET是SQL Server 2012中新增的语法,可以单独使用,也可与FETCH NEXT一起使用,单独使用OFFSET时是查询获取@offset之后所有的数据,如下图所示

但我们想要的是分页查询,那就需要和FETCH NEXT联合使用,OFFSET后跟@offset参数,FETCH NEXT 后跟 @pageSize参数

4.执行计划
上面四种查询方式的执行计划如下:

OFFSET…FETCH补充:

关于参数,推荐用法:始终使用ROWS,始终使用NEXT
-- OFFSET {@offset} ROWS FETCH NEXT {@pagesize} ROWS ONLY
/*
*使用 OFFSET-FETCH 中的限制:
*** ORDER BY 是使用 OFFSET 和 FETCH 子句所必需的。
*** OFFSET 子句必须与 FETCH 一起使用。永远不能使用 ORDER BY … FETCH。
*** TOP 不能在同一个查询表达式中与 OFFSET 和 FETCH 一起使用。
*** OFFSET/FETCH 行计数表达式可以是将返回整数值的任何算术、常量或参数表达式。该行计数表达式不支持标量子查询。
*/
更多OFFSET信息参考这里
对比一下ROW_NUMBER()两种计算数据总数方式的IO消耗:

第一个是使用MAX(RowNum)来计算总数的,第二种是使用子查询的方式来计算总数。
示例SQL:PagedQuery
SQL Server SQL分页查询的更多相关文章
- MySQL、Oracle和SQL Server的分页查询语句
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...
- SQL Server 数据分页查询
最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...
- SQL Server 多种分页查询效率
关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅. 方法1 适用于 SQL Server 任何版本 SELECT TOP 页大小 * FROM table1 ...
- SQL Server 存储过程 分页查询
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- 浅谈SQL Server数据库分页
数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...
- hibernate 对 sql server 2005 分页改进
Hibernate 可以实现分页查询 如下 Query q = session.createQuery("from Cat as c"); q.setFirstResult(100 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- SQL Server多条件查询的实现
SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...
随机推荐
- [Node.js] Node.js中的流
原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...
- NET实现微信公共平台上传下载多媒体文件(转)
举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的.那么我们现在就要分析一下这 ...
- oracle 表被锁了解决方案
使用下面的语句来查询被锁定的表: SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, ...
- MVC知识进阶01
下面是在项目中有关于MVC的知识总结,有些地方若不对,请指出. 一:MVC的基本知识 1 名词解释 *惯例优先原则<约定大于配置>:是一种开发设计模式,说是在项目里面使用事先规定的命 ...
- QTableWidget控件总结<一>
[1]QTableWidget简介 QTableWidget是QT对话框设计中常用的显示数据表格的控件. 学习QTableWidget就要首先看看QTableView控件(控件也是有"家世& ...
- 对于一些Http远程连接Api安全的看法;
文章来源于 :http://lesg.cn/?p=122 我的个人博客站点 对于一些Http远程连接Api安全的看法: 当不同系统需要互相通信的时候:如果无法用webservice等方式链接的时候另一 ...
- DevExpress winform XtraEditor常用控件
最近在公司里面开始使用DevExpress winform的第三方控件进行开发和维护,这里整理一些常用控件的资料以便于后续查看 ComboBoxEdit 这个控件和winform自带的控件差不多,使用 ...
- Android Volley框架的使用(1)
在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013年提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问 ...
- MySQL使用二进制日志恢复数据库
一.二进制日志简介 MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复. 在my.ini文件中设置了log-bin, ...
- Android中GPS定位的简单应用
在Android中通过GPS获得当前位置,首先要获得一个LocationManager实例,通过该实例的getLastKnownLocation()方法获得第一个的位置,该方法的说明如下: void ...