空闲时间里用着 MySQL 学习开发测试平台和测试用具,
在公司里将可用的测试平台部署, 将数据库换成 sqlserver
巴望着能去用 oracle 的公司
MySQL 中的分页
limit 是 MySQL 的语法
select * from table limit m,n
其中 m 是指记录开始的 index, 从 0 开始, 表示第一条记录
n 是指从第 m+1 条开始, 取 n 条.
select * from tablename limit 0,5
即取出第 1 条至第 5 条, 5 条记录
select * from tablename limit 5,5
即取出第 6 条至第 10 条, 5 条记录
sqlserver 中分页
第一种: ROW_NUMBER() OVER() 方式
- select * from (
- select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId from ArtistModels
- ) as b
- where RowId between 10 and 20
- select * from (
- select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId from ArtistModels
- ) as b
- where RowId between 10 and 20
---where RowId BETWEEN 当前页数 - 1 * 条数 and 页数 * 条数 ---
第二种方式: offset fetch next 方式 (SQL2012 以上的版本才支持: 推荐使用 )
- select * from user order by 1 desc
- offset 4 rows fetch next 5 rows only
--order by 1 desc offset 页数 rows fetch next 条数 rows only ----
- select * from user order by 1 desc
- offset 4 rows fetch next 5 rows only
--order by 1 desc offset 页数 rows fetch next 条数 rows only ----
第三种方式: top not in 方式 (适应于数据库 2012 以下的版本)
- select top 3 * from user
- where id not in (select top 15 id from ArtistModels)
- ------where Id not in (select top 条数 * 页数 ArtistId from ArtistModels)
- select top 3 * from user
- where id not in (select top 15 id from ArtistModels)
- ------where Id not in (select top 条数 * 页数 ArtistId from ArtistModels)
oracle 的分页
- /*
- * firstIndex: 起始索引
- * pageSize: 每页显示的数量
- * orderColumn: 排序的字段名
- * sql: 可以是简单的单表查询语句, 也可以是复杂的多表联合查询语句
- */
- select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from tablename t) p where p.rownumber>firstIndex) where rownum<=pageSize
今天整理下 Oracle 分页查询, 希望能够帮到其他小伙伴.
Oracle 分分页查询格式:
- SELECT * FROM
- (
- SELECT A.*, ROWNUM RN
- FROM (SELECT * FROM TABLE_NAME) A
- WHERE ROWNUM <= 40
- )
- WHERE RN>= 21
其中最内层的查询 SELECT * FROM TABLE_NAME 表示不进行翻页的原始查询语句. ROWNUM <= 40 和 RN>= 21 控制分页查询的每页的范围.
上面给出的这个 Oracle 分分页查询语句, 在大多数情况拥有较高的效率. 分页的目的就是控制输出结果集大小, 将结果尽快的返回.
在上面的分页查询语句中, 这种考虑主要体现在 WHERE ROWNUM <= 40 这句上.
选择第 21 到 40 条记录存在两种方法, 一种是上面例子中展示的在查询的第二层通过 ROWNUM <= 40 来控制最大值, 在查询的最外层控制最小值. 而另一种方式是去掉查询第二层的 WHERE ROWNUM <= 40 语句, 在查询的最外层控制分页的最小值和最大值. 查询语句如下:
- SELECT * FROM
- (
- SELECT A.*, ROWNUM RN
- FROM (SELECT * FROM TABLE_NAME) A
- )
- WHERE RN BETWEEN 21 AND 40
对比这两种写法, 绝大多数的情况下, 第一个查询的效率比第二个高得多.
这是由于 CBO 优化模式下, Oracle 可以将外层的查询条件推到内层查询中, 以提高内层查询的执行效率.
对于第一个查询语句, 第二层的查询条件 WHERE ROWNUM <= 40 就可以被 Oracle 推入到内层查询中, 这样 Oracle 查询的结果一旦超过了 ROWNUM 限制条件, 就终止查询将结果返回了.
而第二个查询语句, 由于查询条件 BETWEEN 21 AND 40 是存在于查询的第三层, 而 Oracle 无法将第三层的查询条件推到最内层 (即使推到最内层也没有意义, 因为最内层查询不知道 RN 代表什么).
因此, 对于第二个查询语句, Oracle 最内层返回给中间层的是所有满足条件的数据, 而中间层返回给最外层的也是所有数据. 数据的过滤在最外层完成, 显然这个效率要比第一个查询低得多.
上面分析的查询不仅仅是针对单表的简单查询, 对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效.
完整的 sql 语句:
- SELECT * FROM
- (
- SELECT A.*, ROWNUM RN
- FROM (SELECT * FROM tablename) A
- WHERE ROWNUM <2*5+1
- )
- WHERE RN>(2-1)*5 ;
其中 pageNum=2,pageSize=5,tablename 为表名
来源: https://www.cnblogs.com/qianjinyan/p/10361523.html