`
jiav_net
  • 浏览: 103920 次
文章分类
社区版块
存档分类
最新评论

给初学者分享四种 Sql Server分页查询使用示例

 
阅读更多

当我们显示列表信息的时候,我们常常以分页形式显示,当然在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语句的一些写法。

  最后欢迎大家砸鸡蛋……

  

分享到:
评论

相关推荐

    【sql】分页查询示例

    sql Server 分页查询的一个例子 献给初学者!!!!

    jsp 分页示例源码

    使用jsp+sql server 2005 开发的jsp示例,实用于初学者

    SQL脚本------存储过程分页示例

    一个很详细的SQL脚本分页示例,采用存储过程技术.在加上实例演示,对于初学者有一定帮助.

    小贤PHP通用分页程序 v1.0

    的分页功能给分离出来给广大PHP初学者做为参考或者使用。 程序的演示效果您可以登录到淘宝网寻宝客(http://www.xunbaoke.com)上操作体验,寻宝客网站所有 的分页都是使用本程序来实现的。 程序的优点:可用于伪...

    sql存储过程几个简单例子

    sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解。 例1: create proc proc_...

    asp.net知识库

    将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 ...

    spring+mybatis项目简单例子

    spring+mybatis项目简单例子,适合初学者,数据库为mysql, 里面有sql文件,主要配置都有,没有分页,没有详细的代码,只有基础框架

    Class-Query:简易班级查询

    这是一个脚本,可简化初学者,中级和高级程序员的生活。 该脚本进一步使用mysqli方法连接到数据库,下面有一些用法示例。 主要特征 使用Mysqli(更高的安全性) 分页记录。 没有SQL注入。 函数和类都有很好的记录...

    AspNetPager控件的最基本用法示例介绍

    它弥补了GridView内置分页以及PageDatasource类辅助分页的不足,将分页数据逻辑和页面UI分离开来,非常有利于SQL分页的实现。下面仅举一个最基本的用法,帮助初学者入门。 到AspNetPage官方网站相应页面下载控件:...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

     本书适合PHP的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合PHP程序员参考、查阅。 目 录 目录: 第1篇 基础篇 第1章 开发环境 2 1.1 AppServ——PHP集成化安装包 3 实例001 通过AppServ配置...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

     本书适合PHP的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合PHP程序员参考、查阅。 目 录 目录: 第1篇 基础篇 第1章 开发环境 2 1.1 AppServ——PHP集成化安装包 3 实例001 通过AppServ配置...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

     本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发...

Global site tag (gtag.js) - Google Analytics