oracle如何实现翻页 oracle翻页查询语句

如何实现Oracle数据库的分页显示?

1.使用T_BASE_PROVINCE表作为测试演示使用

创新互联公司-专业网站定制、快速模板网站建设、高性价比庄河网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式庄河网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖庄河地区。费用合理售后完善,十多年实体公司更值得信赖。

2.查询下总共数据量select count(*) from T_BASE_PROVINCE,在分页的时候,一般会显示总页数,需要先查询总数据量得到总页数,总页数=总量/每页显示记录数。

3.前面的测试数据初始化完成之后,查询前20条大概有什么样的数据。

4.含order by排序,多一层嵌套,因为order by在select之后执行,不在里面写的话可能会出现不是预期的排序结果。

如以上回答未能解决问题请看:

一种是利用相反的。

使用minus,即中文的意思就是减去。

一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from [表名],可以看到,是从1到当前的记录总数。    

oracle怎么实现分页

因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:

一种是利用相反的。

PAGESIZE:每页显示的记录数

CURRENTPAGE:当前页号

数据表的名字是:components

索引主键字是:id

select * from components where id not in(select id from components where rownum=(PAGESIZE*(CURRENTPAGE-1))) and rownum=PAGESIZE order by id;

如下例:

select * from components where id not in(select id from components where rownum=100) and rownum=10 order by id;

从101到记录开始选择,选择前面10条。

使用minus,即中文的意思就是减去,呵呵,这语句非常的有意思,也非常好记

select * from components where rownum=(PAGESIZE*(CURRENTPAGE-1)) minus select * from components where rownum=(PAGESIZE*(CURRENTPAGE-2));

如例:select * from components where rownum=10 minus select * from

一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from [表名],可以看到,是从1到当前的记录总数。

select * from (select rownum tid,components.* from components where rownum=100) where tid=10;

oracle数据库怎么实现分页,且每页三条数据

您好:oracle查询分页可分为两种情况,一种使用的是rownum ,另外一种则是使用 row_number() over(order by column_name desc)。

1.使用rownum分页查询,可用以下方式:

select t2.* from (select t1.*,rownum as rn from table_name t1 where 1=1 and rownum = page * page_size) t2 where t2.rn (page - 1) * page_size;

2.使用 row_number() over() 分页查询

select t2.* from (select t1.*,row_number() over(order by column_name desc) as rn from table_name t1 where 1=1 )t2 where t2.rn (page-1)* page_size and t2.rn = page * page_size;

这种方式,也是可以分页的。

希望能帮助您!

Oracle常见SQL分页实现方案

在Oracle中 用SQL来实现分页有很多种实现方式 但有些语句可能并不是很通用 只能用在一些特殊场景之中

以下介绍三种比较通用的实现方案 在以下各种实现中 ROWNUM是一个最核心的关键词 在查询时他是一个虚拟的列 取值为 到记录总数的序号

首先来介绍我们工作中最常使用的一种实现方式

SELECT *

FROM (SELECT ROW_ * ROWNUM ROWNUM_

FROM (SELECT *

FROM TABLE

WHERE TABLE _ID = XX

ORDER BY GMT_CREATE DESC) ROW_

WHERE ROWNUM = )

WHERE ROWNUM_ = ;

其中最内层的查询SELECT为不进行翻页的原始查询语句 可以用自己的任意Select SQL替换 ROWNUM = 和ROWNUM = 控制分页查询的每页的范围

分页的目的就是控制输出结果集大小 将结果尽快的返回 上面的SQL语句在大多数情况拥有较高的效率 主要体现在WHERE ROWNUM = 这句上 这样就控制了查询过程中的最大记录数

上面例子中展示的在查询的第二层通过ROWNUM = 来控制最大值 在查询的最外层控制最小值 而另一种方式是去掉查询第二层的WHERE ROWNUM = 语句 在查询的最外层控制分页的最小值和最大值 此时SQL语句如下 也就是要介绍的第二种实现方式

SELECT *

FROM (SELECT A * ROWNUM RN

FROM (SELECT *

FROM TABLE

WHERE TABLE _ID = XX

ORDER BY GMT_CREATE DESC) A)

WHERE RN BEEEN AND ;

由于Oracle可以将外层的查询条件推到内层查询中 以提高内层查询的执行效率 但不能跨越多层

对于第一个查询语句 第二层的查询条件WHERE ROWNUM = 就可以被Oracle推入到内层查询中 这样Oracle查询的结果一旦超过了ROWNUM限制条件 就终止查询将结果返回了

而 第二个查询语句 由于查询条件BEEEN AND 是存在于查询的第三层 而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义 因为最内层查询不知道RN代表什么) 因此 对于第二个查询语句 Oracle最内层返回给中间层的是所有满足条件的数据 而中间层返回给最外层的也是所有数据 数据的过滤在最外层完成 显然这个效率要比第一个查询低得多

以上两种方案完全是通过ROWNUM来完成 下面一种则采用ROWID和ROWNUM相结合的方式 SQL语句如下

SELECT *

FROM (SELECT RID

FROM (SELECT R RID ROWNUM LINENUM

FROM (SELECT ROWID RID

FROM TABLE

WHERE TABLE _ID = XX

ORDER BY GMT_CREATE DESC) R

WHERE ROWNUM = )

WHERE LINENUM = ) T

TABLE T

WHERE T RID = T ROWID;

从语句上看 共有 层Select嵌套查询 最内层为可替换的不分页原始SQL语句 但是他查询的字段只有ROWID 而没有任何待查询的实际表字段 具体查询实际字段值是在最外层实现的

这种方式的原理大致为 首先通过ROWNUM查询到分页之后的 条实际返回记录的ROWID 最后通过ROWID将最终返回字段值查询出来并返回

和前面两种实现方式相比 该SQL的实现方式更加繁琐 通用性也不是非常好 因为要将原始的查询语句分成两部分(查询字段在最外层 表及其查询条件在最内层)

但这种实现在特定场景下还是有优势的 比如我们经常要翻页到很后面 比如 条记录中我们经常需要查 及其以后的数据 此时该方案效率可能要比前面的高

因为前面的方案中是通过ROWNUM = 来控制的 这样就需要查询出 条数据 然后取最后 之间的数据 而这个方案直接通过ROWID取需要的那 条数据

从不断向后翻页这个角度来看 第一种实现方案的成本会越来越高 基本上是线性增长 而第三种方案的成本则不会像前者那样快速 他的增长只体现在通过查询条件读取ROWID的部分

当然 除了以上提了这些方案 我们还可以用以下的SQL来实现

SELECT *

FROM TABLE

WHERE TABLE _ID NOT IN

(SELECT TABLE _ID FROM TABLE WHERE ROWNUM = )

AND ROWNUM = ;

SELECT *

FROM TABLE

WHERE ROWNUM =

MINUS

SELECT * FROM TABLE WHERE ROWNUM = ;

………………

注意 当ROWNUM作为查询条件时 他是在order by之前执行 所以要特别小心

比如我们想查询TABLE 中按TABLE _ID倒序排列的前 条记录不能用如下的SQL来完成

lishixinzhi/Article/program/Oracle/201311/11198

oracle分页查询语句怎么写每页查询10条

1、通常的分页写法,也是第一种分页方法,类似如下方式:

select * from (

select a.*, rownum rn from

(select * from test a order by object_name) a

where rownum =1000)

where rn 990;

这种方式,是对表进行排序翻页,比较常见,但是,第一页与第1000页的性能差异还是挺明显的。

2、第二种的分页写法是对索引进行翻页操作,然后根据rowid 去表中取数据。 这种方式,第一页与第1000页性能相差不大。

以下语句虽然使用HINT指定使用索引, 但是仍然没有生效。

select b.* from (

select * from (

select a.*, rownum rn from

(select /*+ index(a ix_object_name) */ rowid rid from test a order by object_name) a

where rownum =20)

where rn 10) a, test b

where a.rid = b.rowid;


分享标题:oracle如何实现翻页 oracle翻页查询语句
转载来源:http://cdiso.cn/article/hgchsp.html

其他资讯