转载自: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 分页的实现的更多相关文章

  1. 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题

    最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...

  2. js实现前端分页页码管理

    用JS实现前端分页页码管理,可以很美观的区分页码显示(这也是参考大多数网站的分页页码展示),能够有很好的用户体验,这也是有业务需要就写了一下,还是新手,经验不足,欢迎指出批评! 首先先看效果图: 这是 ...

  3. JdbcTemplate+PageImpl实现多表分页查询

    一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...

  4. MVC如何使用开源分页插件shenniu.pager.js

    最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...

  5. NET Core-TagHelper实现分页标签

    这里将要和大家分享的是学习总结使用TagHelper实现分页标签,之前分享过一篇使用HtmlHelper扩展了一个分页写法地址可以点击这里http://www.cnblogs.com/wangrudo ...

  6. 套用JQuery EasyUI列表显示数据、分页、查询

    声明,本博客从csdn搬到cnblogs博客园了,以前的csdn不再更新,朋友们可以到这儿来找我的文章,更多的文章会发表,谢谢关注! 有时候闲的无聊,看到extjs那么肥大,真想把自己的项目改了,最近 ...

  7. php实现的分页类

    php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...

  8. C#关于分页显示

    ---<PS:本人菜鸟,大手子还请高台贵手> 以下是我今天在做分页时所遇到的一个分页显示问题,使用拼写SQL的方式写的,同类型可参考哦~ ------------------------- ...

  9. JAVA 分页工具类及其使用

    Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; ...

随机推荐

  1. Hadoop 基本架构

    Hadoop 由两部分组成,分别是分布式文件系统和分布式计算框架 MapReduce. 其中分布式文件系统主要用于大规模数据的分布式存储,而 MapReduce 则构建在分布式文件系统之上,对存储在分 ...

  2. [置顶] All about control file in Oracle Database

    --数据库实例启动的三个阶段: NOMOUNT(START):打开初始化参数文件 MOUNT:打开控制文件 OPEN:打开数据文件和日志文件 --控制文件 控制文件的作用:管理数据库的状态和描述数据库 ...

  3. [Functional Programming] Working with two functors(Applicative Functors)-- Part1 --.ap

    What is applicative functor: the ability to apply functors to each other. For example we have tow fu ...

  4. 华为P6-C00电信版,刷机总是失败? FAIL

    关于这个刷机失败的问题,我只想说一点: 华为P6-C00电信版刷机时,不是任意版本都可以刷到任意版本的.我只往上刷过,那就是华为的升级文档中有说明:“只有以下版本才可以升级到此版本”. 如果你的手机的 ...

  5. es5||es6 - array

    导航目录 /** * javascript - array * * ES5: * join() * push() * pop() * shift() * unshift() * sort() * re ...

  6. (数据库)DBCP连接池配置参数说明

    <!-- 数据源1 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicData ...

  7. 如何判断自己家的宽带是否有公网IP

    1)点击链接 http://www.net.cn/static/customercare/yourIP.asp 抓取自己的IP地址 2)打开一个命令提示符窗口 tracert <刚才获取的IP& ...

  8. 通过CSS3,实现元素覆盖效果

    在非常多站点中,我们都能够看到这种效果.当用户鼠标进入某一个元素后,下方就会有遮罩层上浮动画,如图: 今天我们就用hover伪类加上css3实现,没有使用不论什么JS <!DOCTYPE htm ...

  9. 音视频技术 即时通讯SDK

    视频流中的DTS/PTS究竟是什么?      DTS(解码时间戳)和PTS(显示时间戳)各自是解码器进行解码和显示帧时相对于SCR(系统參考)的时间戳.SCR能够理解为解码器应该開始从磁盘读取数据时 ...

  10. php实现二维数组排序array_multisort($ages, SORT_DESC, $home)函数

    1.sql查询排序参数是order by,那么php进行排序呢 可以参考array_multisrot函数 //php进行二维数组排序 -xzz1009 foreach($home as $home) ...