Oracle之分页查询
db2的分页查询语句

db2的分页查询语句
在DB2中,可以使用OFFSET和FETCH FIRST子句来实现分页查询。
具体的语法如下:
```
SELECT *
FROM table_name
ORDER BY column_name
OFFSET start_row ROWS
FETCH FIRST fetch_rows ROWS ONLY;
```
其中,`table_name`是要查询的表名,`column_name`是用于排序的列名,`start_row`是要开始的行数,`fetch_rows`是要获取的行数。
例如,要获取第11行到第20行的数据,可以使用以下语句:
```
SELECT *
FROM table_name
ORDER BY column_name
OFFSET 10 ROWS
FETCH FIRST 10 ROWS ONLY;
```
在这个例子中,`OFFSET 10 ROWS`表示要从第11行开始,`FETCH FIRST 10 ROWS ONLY`表示要获取10行数据。
需要注意的是,DB2中的行数是从0开始计数的,所以如果要获取第1行到第10行的数据,`OFFSET`子句应该为`OFFSET 0 ROWS`。
`ORDER BY`子句是可选的,如果不需要排序,可以省略该子句。
Oracle分页查询优化

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。
Oracle分页查询语句(一)分页查询格式:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM <= 40)WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。
ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个分页查询语句,在大多数情况拥有较高的效率。
分页的目的就是控制输出结果集大小,将结果尽快的返回。
在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21 到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。
而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。
这是,查询语句如下:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (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的分页查询代码

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
28 consistent gets
0 physical reads
0 redo size
4 3 TABLE ACCESS (FULL) OF 'T1' (Cost=826 Card=96985 Bytes=1842715)
5 3 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=1 Card=1 Bytes=11)
6 5 INDEX (UNIQUE SCAN) OF 'PK_T' (UNIQUE)
PL/SQL 过程已成功完成。
SQL> SELECT /*+ FIRST_ROWS */ USER_ID, USERNAME, NAME
2 FROM
3 (
4 SELECT ROWNUM RN, USER_ID, USERNAME, NAME
5 FROM
6 (
7 SELECT ER_ID, ERNAME,
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=97811 Card=20 Bytes=1200)
1 0 VIEW (Cost=97811 Card=20 Bytes=1200)
2 1 COUNT (STOPKEY)
3 2 NESTED LOOPS (Cost=97811 Card=96985 Bytes=2909550)
基于ORACLE存储过程分页的实现方法

vRow :一
db s m
—
s 1e eu e q. x c t
—
a d ft h( Cu s r ; n e c v r o )
d ms b
—
s . ol n q1c um
—
v hl a e
QL 的情况 , 种做 法不可取 , 这 因为 : 据 量 越 S 数
( C r o , i ;一 C p u r o u o v u s r 1,) o y q e y c l mn t
rt n i e e e ur nt g r
I s vCi s rI t ge l o n e r; r v Row nt g r; I ee
用 户使 用 系 统 时 , 统 性 能 的 优 劣 就 体 现 帮 助 文 档 , 以 用游 标 来 实现 , 现方 法 如 系 可 实
有 很 多 , 们 这 里 选 取 一 种 在 实 际 应 用 中 我
效 果 较 好 的分 页方 法 , 方 法 即使 数 据 量 该 明显 增 加 和 查 询 的 条 件 变 化 多 , 能 也 比 性
v ee =v h r I a dx =” l 3 结 束 语 whr : w ee I ’ n m ’
的 技 术 要 在 存 储 过 程 中 实 现 分 页 , 先 首
部 刷 新 , 页 面 显 示 速 度 显 著 改 善 , 少 使 减 ( e e t * f o t po l I slc r m epe’ I
—
考 虑 的 是 使 用 分 析 函 数 rW nl e ( , v e e l ’ O L mb r ) wh r I )t
v ra l. a ib e
d bm s
oracle 分页sql写法

一、概述在进行数据库查询时,经常会遇到需要分页展示数据的情况。
而在Oracle数据库中,需要用到分页查询的SQL语句。
本文将就Oracle 中的分页SQL写法进行详细介绍。
二、基本分页SQL语句在Oracle数据库中,可以使用ROWNUM来实现分页查询。
以下是基本的分页SQL语句示例:```sqlSELECT * FROM (SELECT t.*, ROWNUM rnFROM (SELECT * FROM your_table ORDER BY order_column) t WHERE ROWNUM <= pageSize * pageNum)WHERE rn > pageSize * (pageNum - 1)```其中,your_table是要查询的表名,order_column是用来排序的字段,pageSize是每页展示的数据条数,pageNum是要查询的页数。
三、分页SQL写法解析1. 内部查询和外部查询分页SQL语句中,有一个内部查询和一个外部查询。
内部查询用来获取排序后的数据和每行数据对应的行号,外部查询用来根据行号来筛选需要的数据并展示。
2. 内部查询内部查询中使用了ROWNUM来标记行号,并通过ORDER BY语句来对数据进行排序。
内部查询的结果会被外部查询筛选。
3. 外部查询外部查询使用了WHERE语句来筛选出需要展示的数据,并且通过pageSize和pageNum来计算需要查询的数据范围。
四、使用样例假设有一个名为employee的表,包含字段id、name、age,现需要从该表中查询第2页的数据,每页展示10条数据,并按id字段进行排序。
则对应的分页SQL语句为:```sqlSELECT * FROM (SELECT t.*, ROWNUM rnFROM (SELECT id, name, age FROM employee ORDER BY id) t WHERE ROWNUM <= 10 * 2)WHERE rn > 10 * (2 - 1)```这条SQL语句将返回employee表中第11-20条数据,并按id字段排序。
Oracle Rownum的使用与JSP分页显示的实现

d vd n a e u i g J P ae i t d c d n t e e d,a c n l s n c l b rw h o g n e a l f i ii g p g sn a l ii i g p g sn S r n r u e .I h n o o cu i al e d a n tr u h a x mpe o v d n a e u i g Or ce o d
基于 Oal Rw u 灵活运 用的 JP分页显示实例 , 明选择合适的开发工具并合理利用其有用特性 将带来事半功倍 的 r e onm c S 说
效果。
关 键 词 : rc ;R w u JP O al e o n m; S ;分 页 显 示
中 图 分 类 号 :P l T 31
文献标识码 : A
O al R w u 的使 用 与 JP分 页显 示 的实 现 rce o n m S
徐越 人
( 江 图 书馆  ̄.' 浙 l】 t 文献 部 , 江 杭 州 30 0 ) - r 浙 10 7
摘 要 : 先 对 O al R w u 首 rc e的 o n m使 用 的 诸 多技 巧性 问题 进 行 探 讨 , 然后 介 绍 了 JP分 页显 示 的 原 理 和 基 本 方 法 , S 最后 通 过
0 引 言
近年 来 , 随着信 息 的全 球化 和 国际互联 网的普及 化, 电子商 务 成为 互 联 网应 用 的 最 大热 点 , 来 越 多 越 的企 业通 过使 用 电子商 务技 术来进行 商 业上 的交 易 ,
以降低成 本 。
业 数据 处理等 领域使 用 日益广 泛 。
Ab t a t F rt sr c : i l s y.s me t c n c lk o h w o e h ia n w- o b u sn f a l w u i d s u s d o tu i g o ce Ro n m s ic s e .T e p i c pe a d e s n ilmeh d f Or h r i l n s e t t o so n a
oracle+mybatis-plus+springboot实现分页查询的实例
oracle+mybatis-plus+springboot实现分页查询的实例今天蠢了⼀上午才弄出这玩意,话不多说上代码!1、建⼀个配置类package com.sie.demo.config;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/*** @author liaozhifeng* @date 2021/7/31 11:14* @Version 1.0*/@Configuration@ConditionalOnClass(value = {PaginationInterceptor.class})public class MybatisPlusConfig {// 最新版@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 数据库的配置DbType.ORACLE 根据⾃⼰的数据库选择interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));return interceptor;}}2、service层的代码package com.sie.demo.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import ers;import com.sie.demo.entity.vo.PageUserVo;import erMapper;import erService;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import org.springframework.util.DigestUtils;import javax.annotation.Resource;import javax.servlet.http.HttpSession;import java.util.List;/*** @author liaozhifeng* @date 2021/7/27 14:03* @Version 1.0*/@Service@Slf4jpublic class UserServiceImpl extends ServiceImpl<UserMapper, Users> implements UserService {@ResourceUserMapper userMapper;/*** 分页查询⽤户* @param currentPage* @param pageSize* @return*/@Overridepublic PageUserVo selectAll(long currentPage, long pageSize) {IPage<Users> userPage = new Page<>(currentPage, pageSize);//参数⼀是当前页,参数⼆是每页个数IPage<Users> iPage = userMapper.selectPage(userPage, null);List<Users> list = iPage.getRecords();Long total = iPage.getTotal();PageUserVo pageUserVo = new PageUserVo(list, total);return pageUserVo;}}3、controller层 RetResult是我⾃⼰定义的⼀个统⼀返回的泛型对象package com.sie.demo.controller;import com.baomidou.mybatisplus.core.conditions.Wrapper;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.sie.demo.entity.RetCode;import com.sie.demo.entity.RetResponse;import com.sie.demo.entity.RetResult;import ers;import com.sie.demo.entity.vo.PageUserVo;import erServiceImpl;import com.sie.demo.util.TokenUtil;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import javax.servlet.http.HttpSession;import java.util.List;@Controller@RestController@RequestMapping("user")@Slf4jpublic class UserController {@AutowiredUserServiceImpl userService;/***** @param currentPage* @param pageSize* @return*/@GetMapping("selectAll")public RetResult<PageUserVo> selectAll(long currentPage, long pageSize) {(currentPage+pageSize+"=========================");PageUserVo pageUserVo = userService.selectAll(currentPage,pageSize);return RetResponse.makeOKRsp(pageUserVo);}}到此这篇关于oracle+mybatis-plus+springboot实现分页查询的实例的⽂章就介绍到这了,更多相关 mybatis-plus springboot分页查询内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
分页查询sql语句
分页查询sql语句分页查询是指在查询大量数据时,将数据分成若干页进行显示,并根据用户的需求,动态地加载不同页的数据。
在MySQL数据库中,可以使用LIMIT关键词来实现分页查询。
LIMIT关键词有两个参数,第一个参数指定返回的记录起始位置,第二个参数指定返回的记录数量。
例如,LIMIT 0,10表示返回从第一条记录开始的10条记录。
在进行分页查询时,还需要获取总记录数以计算总页数。
可以使用COUNT函数来获取总记录数,COUNT函数用于统计满足查询条件的记录数。
例如,SELECT COUNT(*) FROMtable_name WHERE condition可以获取满足条件的总记录数。
在应用程序中,一般会根据用户的需求动态地生成分页查询的SQL语句。
以下是一个示例的分页查询SQL语句:```SELECT * FROM table_name WHERE condition LIMITstart_index, page_size;```其中,start_index为起始位置,计算公式为(start_page - 1) * page_size;page_size为每页记录数。
在实际应用中,可以通过计算总记录数和每页记录数来确定总页数,以便提供用户导航和显示页码等功能。
以下是一个示例的获取总记录数的SQL语句:```SELECT COUNT(*) FROM table_name WHERE condition;```获取到总记录数后,可以根据总记录数和每页记录数计算总页数。
例如,总页数 = CEIL(总记录数 / 每页记录数)。
在应用程序中,通常还会根据当前页数和总页数来控制上一页和下一页的导航功能。
可以使用IF语句来判断当前页是否为第一页或最后一页,然后生成相应的SQL语句。
分页查询在实际应用中经常用到,可以提高数据显示效率,减少网络传输时间,并节省服务器和客户端的资源。
在使用分页查询时,还可以结合其他功能,如排序、筛选等,提供更灵活的数据浏览和查询功能。
Oracle TOPN 分页写法大全【博森瑞】
dao@>
dao@>select *
2 from
3 (select rownum rn,object_id,object_name
4 from (
5 select object_id,object_name
| 3 | VIEW | | 90914 | 7013K| | 1168 (1)| 00:00:01 |
| 4 | SORT ORDER BY | | 90914 | 2663K| 3576K| 1168 (1)| 00:00:01 |
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 5 | TABLE ACCESS FULL| DAO_OBJECTS | 90914 | 2663K| | 426 (1)| 00:00:01 |
---------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
基于Oracle RowID实现批量数据的分页下载
V01 9 No 1 . 2 .9
企 业 技 术 开 发
T ECHNOLOGI CAL DEVEL 0PM ENT 0F ENTERP S RI E
21 年 l 00 0月
0c .01 t2 0
基 于 OrceRo D 实现批 量数据 的分 页下载 al wl
在 Oal r e中使州索引的逆 向扫描能提高效率 ,但这 c
是 在 数 据 库 服 务 器 上 把 数 据 查 询 出来 导 到 E cl ; xe 文 有 个限制 , 是在 创 建 索 引时 , 果是 复 合 索 引则 一 定要 就 如
件 , 户 通 过 客 户端 程 序 下 载 E e 文 件 ; 种 是 通 过 分 按 照 常用 的 字段 在 前 的原 则 去 创建 索 引 。 用 xl 一
分 析 并 以 图表 形式 展 现 来 ,由 于参 与 统计 分 析 的数 据
分 页下 载 必 须要 借 助 R w u 来实 现 。 o nm
12 使用 Orce的 So k y功 能 . al tp e
量 比较 大 , 系统 中进行 统 计 分析 比较耗 时 , 响生 产 系 在 影 统 的正 常使 用 。对 于此 类 数据 ,通 常 的做 法 是 把数 据 以
析 ,形 成 业务 数 据 的发 展 趋 势 图表 ,这些 冈表 可 以是 拼
在 C O优化 模 式 下 , r l 可 以将 外 层 的 查 询 条 件 B Oa e c 推 到 内层 查 询 中 , 以提 高 内 层 查 询 的 效 率 ,这 称 之 为
13 使 用 索 引逆 向扫 描 的功 能 .
孙 秀 玲 , 宝 华 姜
(. 1长春 理 _ 大 学 光 电信 息 学 院 , ¨ : 吉林 长 春 1 0 1 2长 春 大学 旅 游 学 院 , 林 长春 10 2 ) 3 0 2; . 吉 30 2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle,SQl,MySql实现分页查询MYSQL的简单查询Limit可以实现分页SELECT * FROM `e-commerce`.computer c where c.price=15 Having c.id in (1,2) order by c.id desc limit 0,1 ;SELECT ername FROM `user` u join contact_info c on (u.id=er_id) andc.address='123';update customer set username='zhouxiaoyu' where id = 1;delete from customer where id=1;insert into customer value(1,'zxy','123456',21,'645144985@');SELECT * FROM customer c;SELECT * FROM `e-commerce`.computer c where c.price=15 group by c.price Having c.id in (1,2);SELECT * FROM `e-commerce`.computer c where c.price=15 Having c.id in (1,2) order by c.id desc;Oracle分页查询格式:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM <= 40)WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。
ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个分页查询语句,在大多数情况拥有较高的效率。
分页的目的就是控制输出结果集大小,将结果尽快的返回。
在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。
而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。
这是,查询语句如下:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) A)WHERE RN BETWEEN 21 AND 40对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
SQL 分页查询格式:1、使用Top和Not IN:select Top 页大小* from TestTable where ID Not In(select Top 页大小*(页数-1)ID from TestTable Order By ID) Order By ID2、利用ID大于多少和Select Top分页:select Top 页大小* from TestTable where ID>( select max(id) from (select top 页大小*(页数-1)id from testTable order by id) as t) order by ID3、利用SQL的游标存储过程分页:create procedure XiaoZhengGe@sqlstr nvarchar(4000), --查询字符串@currentpage int, --第N页@pagesize int --每页行数asset nocount ondeclare @P1 int, --P1是游标的id@rowcount intexec sp_cursoropen @P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount outputselect ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页set @currentpage=(@currentpage-1)*@pagesize+1exec sp_cursorfetch @P1,16,@currentpage,@pagesizeexec sp_cursorclose @P1set nocount off通过SQL 查询分析器,显示比较:我的结论是:分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用Oracle之分页查询Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。
分页查询格式:View CodeSELECT*FROM ( SELECT A.*, ROWNUM RNFROM (SELECT*FROM TABLE_NAME) A WHERE ROWNUM <=40 ) WHERE RN >=21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。
ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个分页查询语句,在大多数情况拥有较高的效率。
分页的目的就是控制输出结果集大小,将结果尽快的返回。
在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。
而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。
这是,查询语句如下:SELECT*FROM ( SELECT A.*, ROWNUM RNFROM (SELECT*FROM TABLE_NAME) A ) WHERE RN BETWEEN21AND40对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。
因此,对于第二个查询语句,Oracle 最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。
数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。
下面简单讨论一下多表联合的情况。
对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。
在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。
那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。
因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:SELECT /*+ FIRST_ROWS */ * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21Oracle分页技术分页技术在任何的规模较大及很大的系统上,都要考虑分页的技术问题。
如果设计分页,如何实现好分页,关系着系统运行的效率,也同样决定着系统吞吐量可以达到一个什么样的级别。
针对不同的数据库,分页的实现方法是不一样的。
Oracle分页技术Oracle数据库为我们提供了两个很重要的字段:RowId和RowNumber。
RowId是一个绝对的值,是针对某一行分配的一个唯一的行标识符,根据它我们可以非常迅捷地定位到某一个具体的行。
它也起着主键的作用,即它是唯一的(Unique)、必有的(Mandatory)字段。
RowNumber是一个相对的值,是指查询结果的行号。
例如Standard标准题录表中有三条题录信息,那么每行对应的RowNumber即为1、2、3。
它是一个从1开始标记的行数信息。
根据RowNumber,我们就可以实现分页技术了。
但是在实施的过程中,也遇到了一个问题。
最开始我认为这样写就可以了:select * from thetablewhere rownumber between ((页码-1) * 页容量 + 1) and (页码 * 页容量)例如如果10条一页,取第二页的内容,那么就是:select * from thetable where rownumber between (2-1)*10+1 and 2*10。
但这是错误的,返回结果会是一个空集合。
对rownumber实施where条件查询是有限制的,只能求前多少多少行,即where rownumber<somevalue。
所以只能让rownumber小于某一值,不能求中间的某一个值域。
虽然RowNumber不能按照上述的方法使用,但是依然存在别的方法来分页。
如果我们求100-200行的记录,需要使用两层select语句。
内层只需要先select出前100行的rowid,以便于从前200行中排除;外层select要做两件事情,一是求出前200行数据,二是排除前100行数据。