转载自: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. 图片变换【Matrix】矩阵 简介

    Matrix矩阵介绍 官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html 在Android中,对图片 ...

  2. 【pyhon】nvshens图片批量下载爬虫1.01

    # nvshens图片批量下载爬虫1.01 # 原先版本在遇到网络故障时回下载不全,这回更改了模式使得下载不成就重新下载,直到全部下载完毕 from bs4 import BeautifulSoup ...

  3. (剑指Offer)面试题39:判断平衡二叉树

    题目: 输入一课二叉树的根结点,判断该树是不是平衡二叉树.如果二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 思路: 1.重复遍历结点 参考上一题求二叉树的深度,先求出根结点 ...

  4. MFC获得主窗体和父窗体指针

    MFC编程中经常遇到子窗体向父窗体传递參数的情况,这就须要获得父窗体的指针. 例:主对话框CMyMainDlg通过buttonButtonA进入对话框CMyParentDlg.CMyParentDlg ...

  5. UNIX网络编程读书笔记:端口号、套接口对和套接口

    端口号 端口号(port number):16位整数,用来区分不同的进程. 服务器使用的端口号:TCP和UDP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务. 客户 ...

  6. Vijos P1002 过河 (NOIP提高组2005)

    链接:https://www.vijos.org/p/1002 解析: 若 p*x+(p+1)*y=Q(採用跳跃距离p和p+1时能够跳至不论什么位置Q),则在Q ≥ P*(P-1)时是一定有解的. 因 ...

  7. vb 获取打印机名称

    Const HKLM = &H80000002 '定义根键常数 '其他常用根键 Const HKCR = &H80000000 , Const HKCU = &H8000000 ...

  8. JSP生成静态html网页

    /** * jsp生成静态html网页 */ public class ToHtml extends HttpServlet { public void service(HttpServletRequ ...

  9. Decorator [ˈdekəreɪtə(r)] 修饰器/装饰器 -- 装饰模式

    装饰模式 -- 原先没有,后期添加的属性和方法 修饰器(Decorator)是一个函数,用来修饰类的行为.这是ES7的一个提案,目前Babel转码器已经支持. 需要先安装一个插件: npm insta ...

  10. ISO镜像安装UbuntuKylin 13.04 64位,启动菜单制作实例

    1.将光盘镜像中的vmlinuz.efi.initrd.lz,和镜像本身(ubuntu....iso) 三个文件复制到U盘根目录下.如果下面的方法没成功启动,你可能要把U盘格式化为USB-HDD FA ...