一、排除Top分页法(自命名,非规范)

思想:所谓“排除Top分页”,主要依靠“排除”和Top这个两大核心步骤。首先查询当前页码之前的数据,然后将该数据从总数据中排除掉,在从剩下的数据中获取前N条记录,就可以得到当前页码的数据。

举例-分页条件:每页显示2条记录,查看第3页

以SQLServer语法实现并说明步骤:

 步骤1:编写基础查询语句并按照字段字段进行排序,排序字段会作为后续的数据筛选条件

1 select * from tableName order by id

 步骤2:获取一个公式,该公式用于计算当前页码之前所有页面的总记录数

  例子的当前页为第3页,那么在第3页之前有2页,并且每页显示2条,最后可得出之前页面总共为:2乘以2等于4条记录。然后根据逻辑得出计算公式:(当前页码-1)*每页显示条数,根据例子分页条件得出:(3-1)*2

 步骤3:使用步骤2的公式加到步骤1语句中作为Top的数值,从而可以查出当前页之前的所有数据。

1  select top ((3-1)*2) * from tableName  order by id

 步骤4:在总数据中排除掉“当前页之前的所有数据”,然后进行排序

1 select * from tableName
2
3 Where id not in ( Select top ((3-1)*2) * id from order by id )
4
5 Order by id

 步骤5:在步骤4的语句中,取出前N条(每页显示的条数)

1 select  top 2 * from tableName
3 Where id not in ( select top ((3-1)*2) * id from order by id )
5 Order by id

SQLite数据库写法:

1 select * from tableName where id
2 not in (select did from DishInfo order by did limit (3-1)*2 )
3 order by did limit 2

注意:SQLite数据库中没有Top关键字,而使用limit关键字来取前N条。

Oracle数据库写法:

1 Select * from
2 Select * from tableName where id not in (
3 Select id from (Seletc id from tableName where rownum<=(3-1)*2 order by id )
4 ) order by id ) where rownum<=2

注意:Oracle数据库中没有Top关键字,而使用rownum来取前N条。


二、游标偏移法(自命名,非规范)

思想和游标的概念比较相似,主要用于SQLite数据库结合 Limit和 Offset关键字来实现。

举例-分页条件:每页显示2条记录,查看第4页

分页思想:

1.求出偏移的起始点,也就从上一页的最后一条数据开始向下偏移。

得出偏移起始点计算公式为:(当前页-1)*每页显示条数

数据例图:

2.获取偏移的数量,也就是等于每页显示的条数,根据示例分页条件得出偏移设立为2。

3.根据偏移起始点和偏移数量得出指定页的数据。

数据例图:

注意:偏移到过的所有行数据即为当前页数据,不包含偏移起始点所在行。

根据思想编写的SQL:

1 select * from tableName order by id Limit 2 OFFSET (4-1)*2

OFFSET :指定偏移起始点,也就是上一页的最后一行

Limit :表示偏移数量

该思想和SubString字符串截取的方法思想也比较像,OFFSET相当于定义截取的位置,Limit 相当于截取的数量。


三、指定范围区间获取法(自命名,非规范)

思想:为查询指定的一个唯一连续性的标识,并结合分页条件计算出筛选范围,对标识进行筛选从而得到当前页的数据。

例-分页条件:每页显示2条记录,查看第3页的数据

以SQLServer语法实现如下:

步骤:

  1.使用row_number函数为查询数据的每行生成一个唯一连续性的标识,该标识可以用于作为筛选范围的条件字段

1 Select * ,rn=row_number()  over (order by id) from tableName

  2.获取筛选数据的起始位置,该起始位置就是当前页之前所有页的总条数,例如当前页是第3页之前就是有2页,每页显示2条记录,那么当前页之前所有页的总条数为:(3-1)*2,因为要显示第3页的第一条,则在计算公式上在+1,最后得到的公式为:(当前页-1)*每页显示的条数+1。

  3.获取筛选数据的结束位置,该位置就是当前页和之前所有页的所有记录数,这也相当于是当前页的最后一条。例如当前页是第3页,结合每页显示2条记录,那么当前页和之前所有页的所有记录数为:3*2,公式为:当前页*每页显示条数。

  4.将步骤1的语句进行嵌套查询,之所以嵌套是因为row_number生成的字段必须嵌套后才能作为条件进行筛选。然后将步骤2和步骤3获取的起始位置和结束位置作为范围条件。根据示例的分页条件最终的语句如下:

1 Select * from (
2
3 Select * ,rn=row_number() over (order by id) from tableName
4
5 ) temp where rn between (3-1)*2+1 and 3*2

Oracle数据库实现

例-分页条件:每页显示2条记录,查看第3页的数据

Oracle和SQLServer的思想是一致的,主要是在步骤1的时候,oracle生成唯一标识之前需要先进行排序,然后在将查询进行嵌套在外层生成行的唯一标识。

1 Select * from (
2
3 Select t.*,rownum as rn (select * from tableName order by id) t
4
5 ) where rn between (3-1)*2+1 and 3*2

四、存储过程动态分页

SQLServer存储过程参考代码:

 1 --动态数据分页存储过程
2 create proc sp_DataPaging
3 @pageIndex int, --当前页码
4 @pageSize int , --每页显示条数
5 @tableName varchar(200),
6 @orderByField varchar(20), --排序字段
7 @rowCount int output ,--总记录数
8 @pageCount int output --总页数
9 as
10 begin
11
12 declare @tempSql nvarchar (max),@beginIndex int ,@endIndex int
13
14 --1.求总记录数
15 set @tempSql='set @rowCount= (select count(*) from '+@tableName+')'
16 execute sp_executesql @tempSql, N'@rowCount int output',@rowCount output
17
18 /*
19 *2.求总页数=总记录数除以每页显示条数
20 *乘以1.0是为了让结果为小数,从而通过CEILING将小数向上取整,解决最后一页不满足显示条数的情况
21 */
22 set @pageCount=CEILING(@rowCount*1.0/@pageSize*1.0)
23
24 --3.求出筛选范围
25 set @beginIndex=(@pageIndex-1)*@pageSize+1
26 set @endIndex=@pageIndex*@pageSize
27
28 --4.生成查询当前页数据的语句
29 set @tempSql=' select * from (
30 select *,rd=ROW_NUMBER() over (order by '+@orderByField+') from '+@tableName+'
31 ) temp where rd between '+cast(@beginIndex as varchar)+' and '+cast(@endIndex as varchar) +' '
32
33 --5.执行语句查询当前页数据
34 exec (@tempSql)
35 end
36 go
37
38 --测试
39 select * from Students order by StudentId
40 declare @pageIndex int, @pageSize int , @rownum int ,@pagenum int ,@tableName varchar(200),@orderByField varchar(20)
41 begin
42 set @pageIndex=5
43 set @pageSize=5
44 set @tableName='Students'
45 set @orderByField='studentid'
46 end
47 exec sp_DataPaging @pageIndex,@pageSize,@tableName,@orderByField,@rownum output,@pagenum output
48 go

Oracle存储过程参考代码:

 1 CREATE OR REPLACE PROCEDURE sp_DataPaging
2 (
3 tableName IN VARCHAR, --表名
4 orderByFiled IN VARCHAR, --排序字段
5 pageIndex IN NUMBER, --当前页码
6 pageSize IN NUMBER, --每页显示条数
7 rowtotal OUT NUMBER , --总条数
8 pageCount OUT NUMBER, --总页数
9 P_CUR_OUT OUT SYS_REFCURSOR
10 )
11 AS
12 tempSql Varchar2(800);
13 beginIndex NUMBER;
14 endIndex NUMBER;
15 BEGIN
16
17 --1.求总条数
18 tempSql:='select count(*) from '||tableName;
19 EXECUTE IMMEDIATE tempSql INTO rowtotal;
20
21 --2.求总页数
22 pageCount:=CEIL(rowtotal/pageSize);
23
24 --3.计算筛选数据的起始和结束范围
25 beginIndex:=(pageIndex-1)*pageSize+1;
26 endIndex:=pageIndex*pageSize;
27
28 --4.生成查询当前分页的语句
29 tempSql:='SELECT * FROM (
30 SELECT t.*,ROWNUM AS rn FROM (SELECT * FROM '||tableName||' ORDER BY '||orderByFiled||' ) t
31 ) WHERE rn BETWEEN '||beginIndex||' AND '||endIndex;
32
33 --5.执行查询
34 --EXECUTE IMMEDIATE tempSql;
35 OPEN P_CUR_OUT FOR tempSql;
36
37 dbms_output.put_line(tempSql);
38 END;

五、ASP.NET实现调用存储过程分页+动态导航栏

案例效果图:

源码地址:https://pan.baidu.com/s/1cWyAI1rQalvfcYl4sSv1Tw

提取码:9vcq

感想 :如今知识技术繁多迭代快速的时代,程序员应当要有一定的代码和知识积累,每个人的大脑不是计算机不可能永远记得所有东西。

分页sql大全的更多相关文章

  1. 分页sql优化

    如果分页sql里包含排序: select * from (...order by id) where rownum <=20 因为要排序,所以即使是分页只取20条,执行计划还是要把所有满足条件的 ...

  2. 报表性能优化方案之单数据集分页SQL实现层式报表

    1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...

  3. Oracle数据库和DB2数据库分页SQL的区别举例

    --------------------------ORACLE数据库分页SQL举例------------------------------------------------ SELECT * ...

  4. 盘点几种数据库的分页SQL的写法(转)

    Data序列——盘点几种数据库的分页SQL的写法http://www.cnblogs.com/fireasy/archive/2013/04/10/3013088.html

  5. Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理

    最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumbe ...

  6. SQL Server 2000/2005 分页SQL — 单条SQL语句

    有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL ...

  7. Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句

    最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页  第一种分页方法 需用到的参数:  pageSize 每页显示多少条数据  pageNu ...

  8. mysql--------大数据量分页sql语句优化

    分页程序原理很简单,这里就不多说了,本篇文章主要说的是在数据表记录量比较大的情况下,如何将分页SQL做到更优化,让MySQL执行的更快的方法. 一般的情况下,我们的分页SQL语句是这样的: ,; 以上 ...

  9. atitit。mssql sql server 转换mysql 及 分页sql ast的搭建

    atitit.mssql sql server 转换mysql  及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...

  10. [转]双TOP二分法生成分页SQL类(支持MSSQL、ACCESS)

    本文转自:http://www.cnblogs.com/jitian/archive/2011/03/22/1991961.html 博客开张,先发以前的几个老物件儿,以前写下来的,现在发上来权当记录 ...

随机推荐

  1. 重磅!Github宣布面向团队免费

    GitHub CEO Nat Friedman 宣布已面向全体 GitHub 用户和团队提供不限制协作人数的私有仓库,并宣称 GitHub 的全部核心功能现已对所有人免费提供. 公告称: 到目前为止, ...

  2. 数据丢失不用怕,火山引擎 DataLeap 提供排查解决方案

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当一家公司的日均处理的数据流量在 PB 级别时,巨大的任务量和数据量会对消息队列(MQ)dump 的稳定性和准确定 ...

  3. JS 判断域名并跳转到指定页面

    判断访问指定域名,进行页面跳转 <!DOCTYPE html> <html> <head> <title>正在玩命加载中--</title> ...

  4. Buffer 缓冲区操作

    1.缓冲区分片在 NIO 中,除了可以分配或者包装一个缓冲区对象外,还可以根据现有的缓冲区对象来创建一个子缓冲区,即在现有缓冲区上切出一片来作为一个新的缓冲区,但现有的缓冲区与创建的子缓冲区在底层数组 ...

  5. CentOS 硬盘扩容

    首先在虚机内将硬盘空间扩大,Hyper-V 需要将检查点删除 查看物理卷和卷组,并将物理卷加入到卷组 lvextend -l +100%FREE /dev/centos/root    #将剩余空间添 ...

  6. 微服务系列-如何使用 RestTemplate 进行 Spring Boot 微服务通信示例

    概述 下面我们将学习如何创建多个 Spring boot 微服务以及如何使用 RestTemplate 类在多个微服务之间进行同步通信. 微服务通信有两种风格: 同步通讯 异步通信 同步通讯 在同步通 ...

  7. 聚合查询 分组查询 F与Q查询 添加新字段

    目录 聚合查询 aggregate 聚合函数 起别名 分组查询 annotate 注释函数 起别名 分组查询报错 分组查询练习 总结 添加新字段 F与Q查询 F查询 字符串拼接 concat方法 Q查 ...

  8. Spring Cloud 和 Dubbo 哪个会被淘汰?

    今天在知乎上看到了这样一个问题:Spring Cloud 和 Dubbo哪个会被淘汰?看了几个回答,都觉得不在点子上,所以要么就干脆写篇小文瞎逼叨一下. 简单说说个人观点 我认为这两个框架大概率会长期 ...

  9. 题解 [HDU6747] Rotate 期望 + 逆元

    来源:2020 年百度之星·程序设计大赛 - 初赛一 一个圈,从内到外一共被分成了 \(n\) 个环,中间是空的. 我们把从外到内第 \(i\) 层环平分成 \(a[i]\) 份,其中 \(a[i]\ ...

  10. AtCoder Regular Contest 116 (A~F补题记录)

    补题链接:Here 第一次打 ARC,被数学题虐惨了 赛后部分数学证明学习自 ACwisher A - Odd vs Even \(T(1≤T≤2×10^5)\)组测试数据,每次询问一个正整数 \(N ...