zoukankan      html  css  js  c++  java
  • 分页查询

    分页查询,就是将将过多的结果在有限的界面上分好多页来显示,这个是很多网站常用的功能,也是最基本的功能,今天简单总结一下。

     

              分页以前听人们说都是一项技术,但是我觉的不尽然。我认为分页是将数据库的数据,利用一些特殊的sql语句来进行查询,显示理所应当显示的内容,更恰当的说可以是对SQL语句的灵活运用,对逻辑思维的简单使用。

     

             一,一般人们将分页查询分为两类:逻辑分页,物理分页,我们先从理论上理解一下:

                 1,逻辑分页概述:就是用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大的集合中,然后存放在session对象,然后通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将之存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,我们还会从session中获取数据,来进行显示。为什么叫逻辑分页呢?因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的。

            来看它的一些缺点吧:

                  a,如果需要查询的数据量过大,session将耗费大量的内存;

                  b,因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。

            小结:这种分页很少使用。但是在数据量小,不会被修改的数据,使用逻辑分页会提高程序的执行效率。

               2,物理分页概述:使用数据库自身所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库实实在在的数据进行分页条件查询,所以叫物理分页。每一次物理分页都会去连接数据库。

                优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

                缺点:物理分页使用了数据库自身带的机制,所以这样的SQL语句不通用,导致不能进行数据库的移植。

               小结:在实际中物理分页还是使用的较多的。

    表中主键必须为标识列,[ID] int IDENTITY (1,1)
     
       1.分页方案一:(利用Not In和SELECT TOP分页)
     
     
     语句形式:
     SELECT TOP 10 *
     FROM TestTable
     WHERE (ID NOT IN
               (SELECT TOP 20 id
              FROM TestTable
              ORDER BY id))
     ORDER BY ID
     
     SELECT TOP 页大小 *
     FROM TestTable
     WHERE (ID NOT IN
               (SELECT TOP 页大小*页数 id
              FROMORDER BY id))
     ORDER BY ID
     
        2.分页方案二:(利用ID大于多少和SELECT TOP分页)
     
    语句形式:
     
       SELECT TOP 10 *
     FROM TestTable
     WHERE (ID >
               (SELECT MAX(id)
              FROM (SELECT TOP 20 id
                      FROM TestTable
                      ORDER BY id) AS T))
     ORDER BY ID
     
     
     SELECT TOP 页大小 *
     FROM TestTable
     WHERE (ID >
       (SELECT MAX(id)
              FROM (SELECT TOP 页大小*页数 id
                      FROMORDER BY id) AS T))
     ORDER BY ID
       3.分页方案三:(利用SQL的游标存储过程分页)
     
     create  procedure SqlPager
     @sqlstr nvarchar(4000), --查询字符串
     @currentpage int, --第N页
     @pagesize int --每页行数
     as
     set nocount on
     declare @P1 int, --P1是游标的id
      @rowcount int
     exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
     select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
     set @currentpage=(@currentpage-1)*@pagesize+1
     exec sp_cursorfetch @P1,16,@currentpage,@pagesize
     exec sp_cursorclose @P1
     set nocount off
     其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
     建议优化的时候,加上主键和索引,查询效率会提高。
     
     通过SQL 查询分析器,显示比较:我的结论是:
     分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
     分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
     分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
     
    关于SQL Server SQL语句查询分页数据的解决方案
    比如:要求选取 tbllendlist 中第3000页的记录,每一页100条记录。
    ----------
    方法1:
    ----------
    select top 100 * from tbllendlist
    where fldserialNo not in
    (
    select top 300100 fldserialNo from tbllendlist
    order by fldserialNo
    )
    order by fldserialNo
    ----------
    方法2:
    ----------
    SELECT TOP 100 *
    FROM tbllendlist
    WHERE (fldserialNo >
    (SELECT MAX(fldserialNo)
    FROM (SELECT TOP 300100 fldserialNo
    FROM tbllendlist
    ORDER BY fldserialNo) AS T))
    ORDER BY fldserialNo
    方法1执行速度比较快!
    不过,这种做法还是很麻烦,强烈期待微软发明新的可分页的SQL语句来!!!!
     
     
    --前提是必需有一列是自动增长类型,唯一性
    --方法一
    SELECT DISTINCT TOP 8 CategoryID
    FROM tbl_Product_Products
    WHERE (UserID = 73) AND (CategoryID >
              (SELECT MAX(categoryid)
             FROM (SELECT DISTINCT TOP 16 categoryid
                     FROM tbl_product_products where userid=73
                     ORDER BY categoryid) AS b))
    ORDER BY CategoryID
    --方法二
    select top 10 * from [order details]
    where orderid>all(select top 10 orderid from [order details] order by orderid)
    order by orderid
  • 相关阅读:
    Vue+Koa2移动电商实战 (一)前端环境搭建
    Hibernate之二级缓存
    Hibernate之QBC检索和本地SQL检索
    Hibernate之HQL介绍
    Hibernate 检索策略
    Hibernate4.x之映射关系--继承映射
    Hibernate4.x之映射关系--多对多
    Hibernate4.x之映射关系--一对一映射
    Hibernate4.x之映射关系--双向1-n
    Hibernate4.x之映射关系--单向一对多
  • 原文地址:https://www.cnblogs.com/hongmaju/p/4570801.html
Copyright © 2011-2022 走看看