zoukankan      html  css  js  c++  java
  • SQL--实现分页查询

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

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

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

        

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

    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执行的结果.

       

                 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的时候发现的. 对原理不熟悉。求各位博友指点。

        

  • 相关阅读:
    主库binlog(master-log)与从库relay-log的关系
    binlog_format不同模式下,对mysqlbinlog恢复的影响
    主从 binlog_format 设置关系
    Mysql5.7多源复制,过滤复制一段时间后增加复制一个库的实现方法
    mysql 5.7安装过程中,初始化的问题
    mysql复制过滤参数说明
    模块化发展
    Angular指令内容小结
    vue项目打包到腾讯云服务器全过程
    Centos7安装Mysql5.7
  • 原文地址:https://www.cnblogs.com/FourLeafCloverZc/p/4240297.html
Copyright © 2011-2022 走看看