sqlservler 分页的实现
转载自:http://www.cnblogs.com/FreeDong/archive/2011/09/27/2193240.html
当我们显示列表信息的时候,我们常常以分页形式显示,当然在ASP.NET中的ListView和GridView控件等都自带了分页功能,但是效 率很低,无法适用大量数据,并且灵活性不高。因而我们一般都使用第三方分页控件或者自己编写分页程序。那么在基于ADO.NET中实现自定义分页的第一步 也就是最关键一步必然是要写分页SQL语句,而且语句效率要高。当然本文的一个目的就是学习编写分页查询语句,另一个目的则是帮助初学者更深入了解 SELECT语句。
那么本文的一个查询示例是查询第11-15条记录,即每页5条,查第3页包含的结果集。查询的视图名为LeaveWordView,该视图有个名为ID的整型自增主键字段。
好了,我现在要引出的第一种写法呢是使用NOT IN关键字。
--IN 和 NOT IN,效率较低
--查询第11-15条记录,后面的语句即可替换为ADO.NET中执行Command的CommandText
SELECT TOP 5 * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP 10 ID FROM LeaveWordView)
--SELECT TOP PageSize * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP (PageIndex-1)*PageSize ID FROM LeaveWordView)
这条语句的原理是先查询1-10条记录的ID,然后再查询ID不属于这1-10条记录的ID,并且只需要5条记录,因为每页大小就是5,这就是获取到的第11-15条记录,这是非常简单的一种写法。另外IN语句与NOT IN语句类似,这是NOT IN的写法,但是显然达不到我们的需求,因为效率太低。所以我们接着看第二种写法。
第二种写法也是相当易于理解,通过若干次升序与降序实现。
--通过升序与降序方式进行查询分页
SELECT * FROM(
SELECT TOP 5 * FROM(
SELECT TOP 15 * FROM LeaveWordView ORDER BY ID ASC)
AS TEMP1 ORDER BY ID DESC)
AS TEMP2 ORDER BY ID ASC
这条语句首先查询前15条记录,然后在倒序查询前5条记录(即倒数5条记录),这个时候就已经获取到了11-15条记录,但是他们的顺序是倒序,所以最后又进行升序排序。
接下来看第三种写法,采用MAX(ID)函数。
--MIN()函数和MAX()函数的使用
--id > 第(PageIndex-1)*PageSize条记录的id AND id <= 第PageIndex*PageSize条记录的id
SELECT TOP 5 * FROM LeaveWordView WHERE ID>
(SELECT MAX(ID) FROM(SELECT TOP 10 ID FROM LeaveWordView ORDER BY ID) AS TEMP1) --(第10条的id)
这个理解起来也简单,先把第十条记录的id找出来(当然这里面是直接使用MAX()进行查找,MIN()函数的用法也是类似的),然后再对比取比第十条记录的id大的前5条记录即为我们需要的结果。
OK,我们了解完了上述三种分页查询语句后,我来看最后一种,也是我本人推荐使用的一种,使用ROW_NUMBER。我记得Oracle有个ROWID,使得我们的查询更方便,因为我们很多时候就比较郁闷于整型的ID字段不连续,导致了原本可以使用很简单很高效的一些SQL语句查询变成了较为复杂。而到SQL Server2005出来的时候,类似的功能实现了,那便是ROW_NUMBER,ROW_NUMBER后面必须跟着OVER(ORDER BY [FIELD]),我们来看具体的写法。
--用行号(ROW_NUMBER)查询,比较高效的查询方式,只有在SQL Server2005或更高版本才支持
--SELECT ROW_NUMBER() OVER(ORDER BY ID) AS ROWID FROM LeaveWordView
SELECT * FROM(
SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,*
FROM LeaveWordView) AS TEMP1
WHERE ROWID>10
在这里面需要注意的是OVER的括号里面可以写多个排序字段,比如:OVER(ORDER BY CreatedTime,ID)。这条语句是查询前15条记录,然后取出ROWID=10以后的记录。
以上是4中常用分页查询语句,其实他们的效率在万级别一下数据的时候,效率相差并不大,但是在处理上百万数据时,毫无疑问我们将选择最后一种方式。本文一个目的是探讨分页查询,另一个呢则是分享SELECT语句的一些写法。
本人实现方法如下:
public List<RegistInfo> queryListforPage(int beginIndex,int endIndex,int pageCount) {
String sql = "SELECT id id,phone_number phoneNumber,regist_content content,regist_date registDate,regist_ok regiestOk,comments comments FROM (SELECT ROW_NUMBER() OVER(ORDER BY id ASC) AS ROWID,* FROM REGIST_INFO) AS TEMP1 WHERE ROWID between ? and ?";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
RegistInfo register = null;
List<RegistInfo> list = new ArrayList<RegistInfo>();
conn = ConnectionManage.getConnection();
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, beginIndex);
ps.setInt(2, endIndex);
rs = ps.executeQuery();
while(rs.next()){
register = new RegistInfo();
register.setComments(rs.getString("comments"));
register.setContent(rs.getString("content"));
register.setId(rs.getInt("id"));
register.setPhoneNumber(rs.getString("phoneNumber"));
register.setRegiestOk(rs.getInt("regiestOk"));
register.setRegistDate(rs.getDate("registDate"));
list.add(register);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCSQLUtils.release(conn, ps, rs);
}
return list;
sqlservler 分页的实现的更多相关文章
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...
- js实现前端分页页码管理
用JS实现前端分页页码管理,可以很美观的区分页码显示(这也是参考大多数网站的分页页码展示),能够有很好的用户体验,这也是有业务需要就写了一下,还是新手,经验不足,欢迎指出批评! 首先先看效果图: 这是 ...
- JdbcTemplate+PageImpl实现多表分页查询
一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...
- MVC如何使用开源分页插件shenniu.pager.js
最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...
- NET Core-TagHelper实现分页标签
这里将要和大家分享的是学习总结使用TagHelper实现分页标签,之前分享过一篇使用HtmlHelper扩展了一个分页写法地址可以点击这里http://www.cnblogs.com/wangrudo ...
- 套用JQuery EasyUI列表显示数据、分页、查询
声明,本博客从csdn搬到cnblogs博客园了,以前的csdn不再更新,朋友们可以到这儿来找我的文章,更多的文章会发表,谢谢关注! 有时候闲的无聊,看到extjs那么肥大,真想把自己的项目改了,最近 ...
- php实现的分页类
php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...
- C#关于分页显示
---<PS:本人菜鸟,大手子还请高台贵手> 以下是我今天在做分页时所遇到的一个分页显示问题,使用拼写SQL的方式写的,同类型可参考哦~ ------------------------- ...
- JAVA 分页工具类及其使用
Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; ...
随机推荐
- Node.js:Express 框架
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.使用 Express 可以快速地搭建一个完整功能的网站 ...
- Jquery chosen动态设置值 select Ajax动态载入数据 设置chosen和获取他们选中的值
在做一个编辑对话框时,要对里面带有select option的操作.主要是想动态载入option和对option的选中.可是由于项目中使用了jquery里的chosen()方法.怎么也无法实现效果 ...
- linux shell的执行方式
./ ping.sh 这个意思 ,'./'的意思是在当前目录执行, ping.sh----------------------------------------------------------- ...
- springMVC之增删改查
一.核心原理 1. 用于发送请求给server: /home.htm 2. 请求被DispatchServlet拦截到 3. DispatchServlet通过HandleMapping检查url有没 ...
- C语言 域名通配符实现
本例实现通配符 * 的功能,不支持*在字符串的末尾, 仅提供思路,函数仅做简单单元测试. 如有使用,还请自己进行修改 // str1: 待匹配字符串 // str2: 带通配符字串 int wildc ...
- Reimplementing event handler
Events in PyQt4 are processed often by reimplementing event handlers. #!/usr/bin/python # -*- coding ...
- 【转发】jQuery1.9.1至最高版本针对checkbox的调整
在jquery 1.8.x中的版本,我们对于checkbox的选中与不选中操作如下: 判断是否选中 $('#checkbox').prop('checked') 设置选中与不选中状态: $('#che ...
- Autofac3 在MVC4中的运用原理
这是一种新的开发模式,注入开发模式,或者叫它IOC模式,说起IOC你可以这样去理解它,它为你的某个实现流出一个注入点,你生产的对象,可以根据你之前的配置进行组合. IOC全称是Inversion o ...
- 谈谈 Java 线程状态相关的几个方法
http://blog.jrwang.me/2016/java-thread-states/ 发表于 2016-07-23 在 Java 多线程编程中,sleep(), interrupt(), wa ...
- java 清单文件
Java之jar打包 标签: javajarmanifestmain-classclass-path 2016-03-30 00:29 993人阅读 评论(0) 收藏 举报 分类: Java(6) ...