SQL--实现分页查询

简介: 原文:SQL--实现分页查询       在查询数据中,对于某些数据量过大,为了减少页面上单页的加载时间,我们常常会选择分页查询,分页查询有很多方法,下面主要介绍两种分页方法。     一. 通过主键来实现分页:         1.数据库背景. Person表,ID主键盘,自增1,varchar行Name.           2.里面包含了10条数据。
原文: 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的时候发现的. 对原理不熟悉。求各位博友指点。

    

目录
相关文章
|
SQL XML Oracle
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
545 0
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
|
XML SQL Java
Mybatis-Plus中实现使用xml文件来写复杂sql
Mybatis-Plus中实现使用xml文件来写复杂sql
2050 0
|
SQL Java 数据库连接
Mybatis中sql拦截增强-AOP+interceptor实现分页和排序
基于interceptor可以实现sql的完整打印,除了实现打印之外。其实还可以实现分页和排序,下面的分页和排序基于aop+mybatis的interceptor实现。其本质还是对mappedStament的boundSql进行增强。 下面的项目来源于github,通过这个我们可以很好的学习mybatis中插件interceptor的使用。
879 0
Mybatis中sql拦截增强-AOP+interceptor实现分页和排序
|
SQL 前端开发 关系型数据库
mysql实现一次将多条不同sql查询结果并封装到一个结果集
最近遇到一个统计查询需求,要求一次性查询多个统计信息,其中两个查询信息不在一个表中,也没有业务关联,表中也没有做连接处理。不考虑产品设计是否合理,完全是实际需求如此,需要一次性查询出来返回给前端进行展示,对于这种“非常规”的统计查询平常肯定会遇见,感觉有点代表性,所以简单记录一下。希望对有相同需求的同学可以作为参考。
mysql实现一次将多条不同sql查询结果并封装到一个结果集
|
SQL 存储 druid
MyCat - 架构剖析 - 核心技术之 SQL 路由实现 | 学习笔记
快速学习 MyCat - 架构剖析 - 核心技术之 SQL 路由实现
MyCat - 架构剖析 - 核心技术之 SQL 路由实现 | 学习笔记
|
SQL 大数据 UED
电商项目之支付类指标统计表 SQL 实现|学习笔记
快速学习电商项目之支付类指标统计表 SQL 实现
电商项目之支付类指标统计表 SQL 实现|学习笔记
|
SQL 大数据 开发者
电商项目之用户指标类统计表 SQL 实现|学习笔记
快速学习电商项目之用户指标类统计表 SQL 实现
电商项目之用户指标类统计表 SQL 实现|学习笔记
|
SQL 大数据 开发者
电商项目之用户浏览 DWS 表 SQL 实现|学习笔记
快速学习电商项目之用户浏览 DWS 表 SQL 实现
电商项目之用户浏览 DWS 表 SQL 实现|学习笔记
|
SQL 大数据 数据处理
电商项目之用户交易宽表 SQL 实现|学习笔记
快速学习电商项目之用户交易宽表 SQL 实现
电商项目之用户交易宽表 SQL 实现|学习笔记
|
SQL 大数据 开发者
电商项目之商家用户交互记录宽表 SQL 实现|学习笔记
快速学习电商项目之商家用户交互记录宽表 SQL 实现
电商项目之商家用户交互记录宽表 SQL 实现|学习笔记

热门文章

最新文章