各种数据库分页查询SQL

一、DB2:

DB2分页查询

sql 复制代码
  SELECT * FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20

以上表示提取第10到20的纪录

sql 复制代码
  select * from (select rownumber() over(order by id asc ) as rowid from table where rowid <=endIndex ) where rowid > startIndex

如果Order By 的字段有重复的值,那一定要把此字段放到 over()中

sql 复制代码
select * from ( select ROW_NUMBER() OVER(ORDER BY DOC_UUID DESC) AS ROWNUM, DOC_UUID, DOC_DISPATCHORG, DOC_SIGNER, DOC_TITLE from DT_DOCUMENT  ) a  where ROWNUM > 20 and ROWNUM <=30

增加行号,不排序

sql 复制代码
select * from ( select ROW_NUMBER() OVER() AS ROWNUM,t.*  from DT_DOCUMENT  t ) a

增加行号,按某列排序

sql 复制代码
select * from ( select ROW_NUMBER() OVER( ORDER BY DOC_UUID DESC ) AS ROWNUM,t.*  from DT_DOCUMENT  t ) a

二、Mysql:

最简单

sql 复制代码
  select * from table limit start,pageNum

比如从10取20个数据

sql 复制代码
  select * from table limit 10,20

三、Oracle:

sql 复制代码
  select * from (select rownum,name from table where rownum <=endIndex ) where rownum > startIndex

例如从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下:

sql 复制代码
  SELECT *

  FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2

  Where t2.R >= 10

四、 sql server:

分页方案一:(利用Not In和SELECT TOP分页)

语句形式:

sql 复制代码
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID

分页方案二:(利用ID大于多少和SELECT TOP分页)

语句形式:

sql 复制代码
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID

分页方案三:(利用SQL的游标存储过程分页)

sql 复制代码
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。

建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:

分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句

分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句

分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

相关推荐
小蜗牛慢慢爬行8 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger11 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud33 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡35 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷37 分钟前
Redis
数据库·redis·缓存
仰望大佬0071 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名1 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪1 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb
呼啦啦啦啦啦啦啦啦3 小时前
【MySQL篇】事务的认识以及四大特性
数据库·mysql