SQL--实现分页查询

系统 1785 0
原文: SQL--实现分页查询

       在查询数据中,对于某些数据量过大,为了减少页面上单页的加载时间,我们常常会选择分页查询,分页查询有很多方法,下面主要介绍两种分页方法。

  一. 通过主键来实现分页:

        1.数据库背景. Person表,ID主键盘,自增1,varchar行Name.

SQL--实现分页查询

     2.里面包含了10条数据。

SQL--实现分页查询

3. 可以通过唯一ID,来进行分页.

      Note: SELECT TOP(( @PageIndex - 1) * @PageSize) ID FROM Person  查询出前面所有的数据的ID. 然后父查询,通过NOT IN 将已经查询过的ID排除。

      
        DECLARE
      
      
        @PageIndex
      
      
        int
      
      
        DECLARE
      
      
        @PageSize
      
      
        int
      
      
        SET
      
      
        @PageIndex
      
      
        =
      
      
        2
      
      
        SET
      
      
        @PageSize
      
      
        =
      
      
        3
      
      
        SELECT
      
      
        TOP
      
      (
      
        @PageSize
      
      ) 
      
        *
      
      
        FROM
      
       Person 
      
        WITH
      
      (NOLOCK) 
      
        WHERE
      
       ID 
      
        NOT
      
      
        IN
      
      (
      
        SELECT
      
      
        TOP
      
      ((
      
        @PageIndex
      
      
        -
      
      
        1
      
      )
      
        *
      
      
        @PageSize
      
      ) ID 
      
        FROM
      
       Person)
    

       二.通过row_number() 来实现分页查询 

         1.不用主键也可以查询,通过row_number来为没一个查询的数据标记上行号,然后在所标记的行号上进行分组取行。

      
        DECLARE
      
      
        @PageIndex
      
      
        int
      
      
        DECLARE
      
      
        @PageSize
      
      
        int
      
      
        SET
      
      
        @PageIndex
      
      
        =
      
      
        2
      
      
        SET
      
      
        @PageSize
      
      
        =
      
      
        3
      
      
        SELECT
      
      
        TOP
      
      (
      
        @PageSize
      
      ) A.ID,A.Name 
      
        FROM
      
       (
      
        SELECT
      
       row_number() 
      
        over
      
      (
      
        order
      
      
        by
      
       id) 
      
        as
      
       rownumber,
      
        *
      
      
        from
      
       Person 
      
        WITH
      
      (NOLOCK)) A 
      
        WHERE
      
       A.rownumber
      
        >
      
      ((
      
        @PageIndex
      
      
        -
      
      
        1
      
      )
      
        *
      
      
        @PageSize
      
      )
    

       三.小Tips

           1.起初在写博客的时候,其实还想过另一种方法,不防可以提出来,大家来看看这段SQL.

      
        SELECT
      
      
        TOP
      
      (
      
        @PageSize
      
      ) 
      
        *
      
      
        FROM
      
       Person 
      
        WHERE
      
       ID 
      
        >
      
      (
      
        SELECT
      
      
        TOP
      
      ((
      
        @PageIndex
      
      
        -
      
      
        1
      
      )
      
        *
      
      
        @PageSize
      
      ) 
      
        MAX
      
      (ID) 
      
        FROM
      
       Person)
    

     2.下面是前面3个SQL执行的结果.

    SQL--实现分页查询

             Note: 第三个sql是没有数据的。对于第三条sql,原理是先取出前面页数中最大的ID为maxID,然后取出ID大于MaxID的数据,取出前面的PageSize行,看起来的确没问题,可是最后一条数据都没有,这是为什么呢,问题出在了下面这半句Sql

      
        SELECT
      
      
        TOP
      
      ((
      
        @PageIndex
      
      
        -
      
      
        1
      
      )
      
        *
      
      
        @PageSize
      
      ) 
      
        MAX
      
      (ID) 
      
        FROM
      
       Person
    

     Note:因为ID是主键自己增加,在调用MAX(ID)的是其实区的是当前最大的ID. (对于当前情况MAX(ID)始终是10,所以没数据)

      四.总结:

            有关MAX(ID)还请了解这方面的解释一下为何是最大的ID.小弟也只是在写sql的时候发现的. 对原理不熟悉。求各位博友指点。

    

SQL--实现分页查询


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论