转载自: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. 数值格式化 NumberFormat DecimalFormat RoundingMode

    NumberFormat [简介] java.text.NumberFormat extends java.text.Format extends java.lang.Object 实现的接口:Ser ...

  2. 《java 语言程序设计》第3、4章编程练习

    3.1 public class test { public static void main(String[] args) { System.out.println("Enter a, b ...

  3. [Algorithm -- Dynamic Programming] Recursive Staircase Problem

    For example there is a staricase N = 3 | ---|   |---|    | |---|            | ---|                  ...

  4. [Transducer] Make Transducer works for Iteratable collection and Object

    We've seen how we can transduce from arrays or other iterables, but plain objects aren't iterable in ...

  5. nGrinder二次开发之监控机器性能数据

    转载:https://blog.csdn.net/neven7/article/details/53909256 1.背景 做性能测试时,统计性能数据分为被压系统的数据和被压系统所在机器的数据,被压系 ...

  6. 协议名称处理函数xxxprotoxxx()

    为了方便操作,Linux提供了一组用于查询协议的值及名称的函数. xxxprotoxxx()函数: 上面的函数对文件/etc/protocols中的记录进行操作,文件中记录了协议的名称.值和别名等值, ...

  7. mindmanager2018官方下载地址

      mindmanager2018官方下载地址 CreationTime--2018年6月6日09:09:56 Author:Marydon 找了很多都是假的链接地址,流氓软件,根本不能输入许可密钥, ...

  8. Java反射机制及Method.invoke详解

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  9. 查看Linux磁盘空间大小命令

    发表于:2012-09-17 10:25   查看Linux磁盘空间大小 一.df 命令: df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文 ...

  10. 【LeetCode】78. Subsets (2 solutions)

    Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...