一、排除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. Error: Could not find or load main class org.elasticsearch.tools.java_version_checker.JavaVersionChecker

    把elasticsearch目录换到不属于root目录的其他目录就行了

  2. 【Java 进阶篇】使用 Stream 流和 Lambda 组装复杂父子树形结构(List 集合形式)

    目录 前言 一.以部门结构为例 1.1实体 1.2返回VO 1.3具体实现 1.4效果展示 二.以省市县结构为例 2.1实体 2.2返回VO 2.3具体实现 2.4效果展示 三.文章小结 前言 在最近 ...

  3. API 设计最佳实践(简版)

    Restful API 本文简称API,是一个种面向资源的架构.在Restful中一个API对应一个资源,资源可以是文本,图片,视频等.API特征有如下: 每一个URI代表一种资源 客户端和服务器之间 ...

  4. WPF 组织机构摄像机树 全量加载 大数据量 分页加载摄像机节点

    WPF 组织机构摄像机树 全量加载 大数据量 分页加载摄像机节点 完整代码: https://gitee.com/s0611163/WpfTreeDemo 性能: 8000组织机构20万摄像机,全量加 ...

  5. 使用nginx代理emqx的TCP、WS、WSS连接请求

    项目代理关系: 注:主机上已存在名为:nginx-proxy 的一级 nginx 的代理,将监听了主机的 80.443端口 docker-compose.yml version: "3.7& ...

  6. OJ中的语言选项里G++ 与 C++的区别

    概念上: C++是一门计算机编程语言,而G++则是C++的编译器. GCC和G++都是GUN的编译器,cc是Unix系统的C Compiler,而gcc则是GNU Compiler Collectio ...

  7. M-SOLUTIONS Programming Contest 2020 游记 (AB水题,CD模拟,E题DFS)

    A - Kyu in AtCoder 水题 B - Magic 2 题意很好理解,但写的时候注意一下边界 void solve() { int a, b, c, k; cin >> a & ...

  8. L3-001. 凑零钱-PAT团体程序设计天梯赛GPLT(01背包,动态规划)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 104 枚来自各个星球的硬币,需要请你帮她盘算一下 ...

  9. 分库分表Sharding-JDBC + MyBatis-Plus动态表名

    MyBatis-Plus动态表名 1: https://blog.csdn.net/Zack_tzh/article/details/107529746?utm_medium=distribute.p ...

  10. python之数学函数应用

    一.abs(x) 1.作用: 函数返回 x(数字)的绝对值,如果参数是一个复数,则返回它的大小(模) 2.举例说明: #1.abs() a = abs(-15) print(a) b = abs(1+ ...