首页 > 数据库 ><摘自https://blog.csdn.net/JavaAndLI/article/details/125359786>SQL分页查询的写法总结-MySQL、SQL Server、Ora

<摘自https://blog.csdn.net/JavaAndLI/article/details/125359786>SQL分页查询的写法总结-MySQL、SQL Server、Ora

时间:2022-08-17 10:25:04浏览次数:70  
标签:ROWS -- SQL EMP MySQL Oracle 100 FETCH SELECT

MySQL的分页实现是使用LIMIT关键字。

Oracle的分页是实现主要是基于rownum行号。

SQL Server的分页主要使用的关键字是TOP。

 

具体用法总结如下:

本文中的变量名词说明:

1,分页一般有两个参数,当前页 pageIndex,每页数量 pageSize。

2,实例中查询表名EMP,主键为ID,查询每页数量100条。数据表中共10W条记录。

 

MySQL分页写法:

LIMIT语法: LIMIT {[offset,] row_count | row_count OFFSET offset}

LIMIT子句可以被用于限制被SELECT语句返回的行数。

使用两个参数时,第一个参数指定返回的偏移量,第二个参数指定返回的行数。初始行的偏移量为0(不是1):

mysql> SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

使用一个参数时,指定从开头返回的行数:

mysql> SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

 

写法实现:

-- 分页查询 通用语句
SELECT * FROM TABLE
LIMIT (pageIndex-1)*pageSize,pageSize

-- 第一页 每页100条
SELECT * FROM EMP LIMIT 0,100
-- 第二页 每页100条
SELECT * FROM EMP LIMIT 100,100
-- 第801页 每页100条
SELECT * FROM EMP LIMIT 80000,100 -- 用时0.046s

 

 

Oracle分页写法:写法一:ROWNUM 关键字使用

rownum 是伪列,数据库自己创建出来的字段。为每个查询的结果集从1开始生成序号。

rownum不支持>, >=, =, between and,只支持<, <=等。

查询时使用rownum <= 5 返回5条数据,rownum <=10 and rownum >=6 返回0条数据。

为了实现分页,一般使用子查询使rownum成为子查询结果集的具体列。

写法实现:

-- 分页查询 通用语句
SELECT * FROM
( SELECT ROWNUM AS MYROWNUM, t1.* FROM TABLE t1 ORDER BY ID ) t2
WHERE MYROWNUM > ( pageIndex - 1 ) * pageSize
AND MYROWNUM <= pageIndex * pageSize

-- 第一页 每页100条
SELECT * FROM
( SELECT ROWNUM AS RN, E.* FROM EMP E ORDER BY ID ) T
WHERE RN > 0 AND RN <= 100 -- 用时0.023s
-- 第二页 每页100条
SELECT * FROM
( SELECT ROWNUM AS RN, E.* FROM EMP E ORDER BY ID ) T
WHERE RN > 100 AND RN <= 200 -- 用时0.026s
-- 第801页 每页100条
SELECT * FROM
( SELECT ROWNUM AS RN, E.* FROM EMP E ORDER BY ID ) T
WHERE RN > 800100 AND RN <= 800200 -- 用时0.046s

 

 

写法二:利用OFFSET/FETCH NEXT(Oracle 12C 以上版本)

OFFSET/FETCH 语法:

[ OFFSET offset ROWS]
FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]

1,OFFSET 子句指定在行限制开始之前要跳过行数
2,FETCH 子句指定要返回的行数或百分比
3,简单理解为:offset A rows ,将前A条记录舍去,fetch next B rows only ,向后在读取B条数据

 

写法实现:

-- 分页查询 通用语句
SELECT * FROM TABLE
OFFSET ( pageIndex - 1 ) * pageSize ROWS
FETCH NEXT pageIndex * pageSize ROWS ONLY

-- 第一页 每页100条
SELECT * FROM EMP ORDER BY ID OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
-- 第二页 每页100条
SELECT * FROM EMP ORDER BY ID OFFSET 100 ROWS FETCH NEXT 200 ROWS ONLY -- 用时0.016s
-- 第801页 每页100条
SELECT * FROM EMP ORDER BY ID OFFSET 80000 ROWS FETCH NEXT 80100 ROWS ONLY --用时0.135s

 

SQL Server分页写法:

写法一:使用TOP和子查询

TOP 将在查询结果集中返回的行数限制到指定行数

写法实现:

-- 分页查询 通用语句
SELECT TOP pageSize * FROM TABLE
WHERE ID NOT IN (
SELECT TOP (pageIndex-1)*pageSize ID FROM TABLE
)

-- 第一页 每页100条
select top 100 * from EMP --where id not in (select top 0 id from emp )
-- 第二页 每页100条
select top 100 * from EMP where id not in (select top 100 id from emp )
-- 第801页 每页100条
select top 100 * from EMP where id not in (select top 80000 id from emp )

写法二:利用row_number()函数返回行号实现(2005版本以上)

row_number() over(order by id)函数计算出行数,利用子查询即可实现,可结合top使用。

写法实现:

-- 分页查询 通用语句
SELECT TOP pageSize * FROM
(select row_number() over(order by id ) AS myrownumber,* from TABLE) t
WHERE myrownumber > (pageIndex-1)*pageSize
--或者使用 <=
SELECT * FROM
(select row_number() over(order by id ) AS myrownumber,* from TABLE) t
WHERE myrownumber > (pageIndex-1)*pageSize and myrownumber <= pageIndex*pageSize


-- 第一页 每页100条
select top 100 * from EMP
select TEMP.* from (select row_number() over(order by id ) AS rownumber,* from EMP) TEMP where rownumber >0 and rownumber <=100

-- 第801页 每页100条
select top 100 TEMP.* from (select row_number() over(order by id ) AS rownumber,* from EMP) TEMP where rownumber >80000
select TEMP.* from (select row_number() over(order by id ) AS rownumber,* from EMP) TEMP where rownumber >80000 and rownumber <=80100

 

写法三:利用 ORDER BY 子句 OFFSET/FETCH

适用于:SQL Server 2012 (11.x) 及更高版本和 Azure SQL 数据库。

OFFSET 和 FETCH 语法:

-- Syntax for SQL Server and Azure SQL Database

ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ ,...n ]
[ <offset_fetch> ]

<offset_fetch> ::=
{
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[
FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
]
}

1,OFFSET 指定开始从查询表达式返回行之前跳过的行数。 该值可以是大于或等于零的整数常量或表达式
2,FETCH 指定在处理 OFFSET 子句后返回的行数。 该值可以是大于或等于 1 的整数常量或表达式。
3,要有ORDER BY 没有ORDER BY无法查询到结果

 

写法实现:

-- 分页查询 通用语句
SELECT * FROM TABLE
ORDER BY ID
OFFSET ( pageIndex - 1 ) * pageSize ROWS
FETCH NEXT pageIndex * pageSize ROWS ONLY

-- 第一页 每页100条
SELECT * FROM EMP ORDER BY ID OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
-- 第二页 每页100条
SELECT * FROM EMP ORDER BY ID OFFSET 100 ROWS FETCH NEXT 200 ROWS ONLY
-- 第801页 每页100条
SELECT * FROM EMP ORDER BY ID OFFSET 80000 ROWS FETCH NEXT 80100 ROWS ONLY

 

提示:

SQL Sever限制行数推荐使用TOP(或 OFFSET 和 FETCH):

使用 TOP(或 OFFSET 和 FETCH)而非 SET ROWCOUNT 限制返回的行数。 这些方法之所以优于使用 SET ROWCOUNT,原因包括以下各项:

作为 SELECT 语句的一部分,查询优化器在查询优化期间可能会考虑 TOP 或 FETCH 子句中 expression 的值。 由于在运行查询的语句外部使用 SET ROWCOUNT,不会在查询计划中考虑它的值。

 

标签:ROWS,--,SQL,EMP,MySQL,Oracle,100,FETCH,SELECT
From: https://www.cnblogs.com/shaowangwu/p/16594054.html

相关文章

  • mysql(一)
    SQL(StructuredQueryLanguage)结构化查询语言全世界所有的结构化数据库都适用分类DDL:数据库定义语言(定义数据库的一些组件表索引视图自增序列...)DML:数据库操......
  • EasyCVR切换为新版本时设备全部离线,用户应该如何正确配置MySQL数据库?
    关于TSINGSEE青犀视频平台数据库切换的操作步骤、迁移数据时遇到的异常等相关技术类文章,我们在博文中分享过很多,感兴趣的用户可以翻阅我们的往期文章进行了解。TSINGSEE青......
  • 【SQL】SQL常见窗口函数整理汇总大全(用到over的场景)
    〇、概述1、常用网站SQL窗口函数:https://blog.csdn.net/liangmengbk/article/details/1242538062、介绍像聚合函数一样对一组数据进行分析并返回结果3、与聚合函数的......
  • docker 安装oracle
    1、docker安装参考:     https://www.cnblogs.com/snailgirl/p/15503867.html2、拉取镜像     dockerpullregistry.cn-hangzhou.aliyuncs.com/helowin......
  • 2022-8-16 mysql 第二天 约束
    DQL数据库查询语言重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。构建数据库创建一张student表:DROPTABLEIFEXISTSst......
  • 迁移与备份,Dockerfile,Docker私有仓库,Docker-compose,Mysql主从搭建,django读写分离
    1迁移与备份#一个容器内,尽量只有一个软件,不要把mysql,redis,。。。方到一个容器中,而要放到多个容器#镜像---》容器---》装了软件(vim,mysql)---》打包成镜像#打包后的镜......
  • MySQL篇:MySQL主从搭建、django读写分离
    目录一、MySQL主从搭建1.1什么是主从同步?1.2原理1.3搭建步骤1.3.1拉取mysql5.7镜像1.3.2创建一些文件夹,用来做目录映射1.3.3启动两个docker容器1.3.4链接主库1.3.5......
  • mysql术语通解
    数据库---文件夹表---文件字段---表头索引---目录约束---限制键---序号内连接---向右关联两张表的公共区外连接---向右关联两张表的公共区+独有区左外连接......
  • MySQL45讲-事务隔离和索引
    一、事务1.概述事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。MyISAM引擎就不支持事务,InnoDB是支持事务。2.隔离......
  • MySQL45讲学习-基础构架查询和更新一条sql语句
    一、基础构架1.概述MySQL可以分为Server层和存储引擎层两部分,Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所......