分页sql大全
一、排除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大全的更多相关文章
- 分页sql优化
如果分页sql里包含排序: select * from (...order by id) where rownum <=20 因为要排序,所以即使是分页只取20条,执行计划还是要把所有满足条件的 ...
- 报表性能优化方案之单数据集分页SQL实现层式报表
1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...
- Oracle数据库和DB2数据库分页SQL的区别举例
--------------------------ORACLE数据库分页SQL举例------------------------------------------------ SELECT * ...
- 盘点几种数据库的分页SQL的写法(转)
Data序列——盘点几种数据库的分页SQL的写法http://www.cnblogs.com/fireasy/archive/2013/04/10/3013088.html
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumbe ...
- SQL Server 2000/2005 分页SQL — 单条SQL语句
有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL ...
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNu ...
- mysql--------大数据量分页sql语句优化
分页程序原理很简单,这里就不多说了,本篇文章主要说的是在数据表记录量比较大的情况下,如何将分页SQL做到更优化,让MySQL执行的更快的方法. 一般的情况下,我们的分页SQL语句是这样的: ,; 以上 ...
- atitit。mssql sql server 转换mysql 及 分页sql ast的搭建
atitit.mssql sql server 转换mysql 及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...
- [转]双TOP二分法生成分页SQL类(支持MSSQL、ACCESS)
本文转自:http://www.cnblogs.com/jitian/archive/2011/03/22/1991961.html 博客开张,先发以前的几个老物件儿,以前写下来的,现在发上来权当记录 ...
随机推荐
- 重磅!Github宣布面向团队免费
GitHub CEO Nat Friedman 宣布已面向全体 GitHub 用户和团队提供不限制协作人数的私有仓库,并宣称 GitHub 的全部核心功能现已对所有人免费提供. 公告称: 到目前为止, ...
- 数据丢失不用怕,火山引擎 DataLeap 提供排查解决方案
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当一家公司的日均处理的数据流量在 PB 级别时,巨大的任务量和数据量会对消息队列(MQ)dump 的稳定性和准确定 ...
- JS 判断域名并跳转到指定页面
判断访问指定域名,进行页面跳转 <!DOCTYPE html> <html> <head> <title>正在玩命加载中--</title> ...
- Buffer 缓冲区操作
1.缓冲区分片在 NIO 中,除了可以分配或者包装一个缓冲区对象外,还可以根据现有的缓冲区对象来创建一个子缓冲区,即在现有缓冲区上切出一片来作为一个新的缓冲区,但现有的缓冲区与创建的子缓冲区在底层数组 ...
- CentOS 硬盘扩容
首先在虚机内将硬盘空间扩大,Hyper-V 需要将检查点删除 查看物理卷和卷组,并将物理卷加入到卷组 lvextend -l +100%FREE /dev/centos/root #将剩余空间添 ...
- 微服务系列-如何使用 RestTemplate 进行 Spring Boot 微服务通信示例
概述 下面我们将学习如何创建多个 Spring boot 微服务以及如何使用 RestTemplate 类在多个微服务之间进行同步通信. 微服务通信有两种风格: 同步通讯 异步通信 同步通讯 在同步通 ...
- 聚合查询 分组查询 F与Q查询 添加新字段
目录 聚合查询 aggregate 聚合函数 起别名 分组查询 annotate 注释函数 起别名 分组查询报错 分组查询练习 总结 添加新字段 F与Q查询 F查询 字符串拼接 concat方法 Q查 ...
- Spring Cloud 和 Dubbo 哪个会被淘汰?
今天在知乎上看到了这样一个问题:Spring Cloud 和 Dubbo哪个会被淘汰?看了几个回答,都觉得不在点子上,所以要么就干脆写篇小文瞎逼叨一下. 简单说说个人观点 我认为这两个框架大概率会长期 ...
- 题解 [HDU6747] Rotate 期望 + 逆元
来源:2020 年百度之星·程序设计大赛 - 初赛一 一个圈,从内到外一共被分成了 \(n\) 个环,中间是空的. 我们把从外到内第 \(i\) 层环平分成 \(a[i]\) 份,其中 \(a[i]\ ...
- AtCoder Regular Contest 116 (A~F补题记录)
补题链接:Here 第一次打 ARC,被数学题虐惨了 赛后部分数学证明学习自 ACwisher A - Odd vs Even \(T(1≤T≤2×10^5)\)组测试数据,每次询问一个正整数 \(N ...