当前位置:首页 » 编程语言 » oracle分页查询sql

oracle分页查询sql

发布时间: 2022-06-26 08:11:24

‘壹’ oracle做分页查询怎么做

sql语句如下:

  • 分页1

  1. SELECT *

  2. FROM (Select ROWNUM AS ROWNO, T.*

  3. from 表名 T(别名)

  4. where 表字段 between to_date('20060501', 'yyyymmdd') and to_date('20060731', 'yyyymmdd')

  5. AND ROWNUM <= 20) TABLE_ALIAS

  6. WHERE TABLE_ALIAS.ROWNO >= 10;

  7. 经过测试,此方法成本最低,只嵌套一层,速度最快,即使查询的数据量再大,也几乎不受影响,速度依然.


  • 分页2:

  1. SELECT *

  2. FROM (SELECT TT.*, ROWNUM AS ROWNO

  3. FROM (Select t.*

  4. from 表名 T(别名)

  5. where flight_date between to_date('20060501', 'yyyymmdd') and

  6. to_date('20060531', 'yyyymmdd')

  7. ORDER BY FACT_UP_TIME, flight_no) TT(别名二)

  8. WHERE ROWNUM <= 20) TABLE_ALIAS

  9. where TABLE_ALIAS.rowno >= 10;

    经过测试,此方法随着查询范围的扩大,速度也会越来越慢,


‘贰’ 用SQL写出分页查询

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A --不排序
WHERE ROWNUM <= 40
)
WHERE RN >= 21;

SELECT *
FROM (SELECT a.*, row_number() over(ORDER BY 1) rn--假排序,速度同上
FROM t1 a)
WHERE rn BETWEEN 21 AND 40;

SELECT *
FROM (SELECT a.*, row_number() over(ORDER BY c1) rn --真实排序,无法比较速度
FROM t1 a)
WHERE rn BETWEEN 21 AND 40;

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控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在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最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO 一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

‘叁’ oracle中要根据部门id分页查询Sql语句怎么写

oracle分页有通用写法,假设一页5行
select * from (
select t.*,rownum from (
select * from table1 where condition order by column) t )
where rownum>(pangeNow-1)*5 and rownum<=(pageNow)*5

如果基础查询不需要排序,可以省掉一层嵌套
select * from (
select t.*,rownum from table1 t where condition )
where rownum>(pangeNow-1)*5 and rownum<=(pageNow)*5

‘肆’ 论述Oracle分页查询的几种方式

sql语句如下:
分页1
SELECT *
FROM (Select ROWNUM AS ROWNO, T.*
from 表名 T(别名)
where 表字段 between to_date('20060501', 'yyyymmdd') and to_date('20060731', 'yyyymmdd')
AND ROWNUM <= 20) TABLE_ALIAS
WHERE TABLE_ALIAS.ROWNO >= 10;
经过测试,此方法成本最低,只嵌套一层,速度最快,即使查询的数据量再大,也几乎不受影响,速度依然.

分页2:
SELECT *
FROM (SELECT TT.*, ROWNUM AS ROWNO
FROM (Select t.*
from 表名 T(别名)
where flight_date between to_date('20060501', 'yyyymmdd') and
to_date('20060531', 'yyyymmdd')
ORDER BY FACT_UP_TIME, flight_no) TT(别名二)
WHERE ROWNUM <= 20) TABLE_ALIAS
where TABLE_ALIAS.rowno >= 10;
经过测试,此方法随着查询范围的扩大,速度也会越来越慢,

‘伍’ 实现oracle分页的sql语句

下面是用ORACLE数据库pl/sql编程实现的一个方式:
-------------------创建一个包--------------------------
create or replace package pages_query_pak as
type pages_cursor is ref cursor; --定一个游标,保存数据查询得到的结果集
end pages_query_pak;
------------------创建一个过程----------------------
create or replace procere pages_pro(
tableName in varchar2,
pageSize in number,--每一页显示的记录数
pageNow in number,--显示第几页
myRows out number,--总记录数
pageCount out number,--总页数
page_cursor out pages_query_pak.pages_cursor--返回的记录集 这里有用了上面那个包
) is
v_sql varchar2(1000);
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow*pageSize;
begin
v_sql:='select * from (select bt.*,rownum rnum from (select * from '|| tableName ||')bt
where rownum<='||v_end||') where rnum>='||v_begin;
open page_cursor for v_sql;
--计算myRows和pageCount

v_sql:='select count(*) from '||tableName;
execute immediate v_sql into myRows;
if mod(myRows,pageSize)=0 then
pageCount:=myRows/pageSize;
else
pageCount:=myRows/pageSize+1;
end if;
end;

‘陆’ 在oracle数据库中的分页SQL语句怎么写

前提:

分页参数:size = 20 page = 2;

没有order by的查询;

嵌套子查询,两次筛选(推荐使用)。

SQL语句:

SELECT *

FROM (SELECT ROWNUM AS rowno, t.*

FROM DONORINFO t

WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

AND TO_DATE ('20060731', 'yyyymmdd')

AND ROWNUM <= 20*2) table_alias

WHERE table_alias.rowno > 20*(2-1);

(6)oracle分页查询sql扩展阅读:

rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有不满足条件的记录。

可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2。

依次类推:当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。下条的rownum还会是1,又被删除,依次类推,便没有了数据。

‘柒’ 如何写 oracle联合查询分页的sql语句

oracle使用rownum伪列可以实现分页,三表连接分页示例代码如下:

1

select * from (select rownum r,k.kch,k.kcm,cj.cj,x.xh,x.xm from KCB k,CJB cj,XSB x where k.kch = cj.kch and cj.xh = x.xh and rownum<=10) where r>0

特别注意这样外层查询时由于内层查询的字段有重复列名,所以内层查询最后不要用*。取完每一个表字段,这样很容易报错(“无效字段”)

‘捌’ oracle 分页查询 为什么第一次子查询用rownum,第二次用rn,其他方式都不可以呢

rownum 是一个虚列,不属于表,只是用来给结果序号
要考虑结果逻辑。
比如我可以写rownum>0或者rownum >= 1,查询结果是全部结果
但是如果写rownum > 1 结果就是空的。
解答:因为第一个结果rownum应该为1,不符合,所以排除
第二条,因为第一条被排除了,这一条应被安排在结果的第一个,rownum也应该排为1,所以不符合,排除
依次类推,全部都不符合,所以结果为空
而如果我将rownum作为一个临时结果,再从这个临时结果进行查询,就可以使用这个值了
所以我们可以先成立一个临时结果:select t1.*, rownum as "rn" from t1
然后从这个结果尽心查询:select * from (select t1.*, rownum as "rn" from t1) where "rn" > 10 and "rn" <= 20
但是一般都会把小于等于放在第一个结果中,因为第一个结果是临时的,会占用内存,而且还不确定这个表的数据量具体有多大,所以,尽量减少临时结果的大小,能起到增加效率的效果
select * from (select t1.*, rownum as "rn" from t1 where rownum <= 20) where "rn" > 10
注:你提到的rn,并不是一个固定值,而是临时存放rownum的临时结果的列,起了一个名字叫rn, 在字段的后面,用[as 列名] 表示,也能用 [as "列名"]表示,语句当然可以写成:select * from (select t1.*, rownum as aaa1234 from t1) where aaa1234 > 10 and aaa1234 <= 20;
别名的命名规则基本上是毫无顾忌的。只是如果不符合命名规则,比如数字开头,拥有空格,运算符号,关键字 等情况的列名,需要用双引号引起来,但是要注意,双引号的列名,使用时也最好(非必须)用双引号,因为系统执行sql语句时,会将没有引号的字母全部翻译成大写,再执行,如果使用as "rn" ,然后使用rn查询时,查询语句中的rn会翻译成RN,与字段名的rn对应不上,报:找不到该字段的错误。(当然,如果定义为 "RN",查询语句中用rn 可以对应上,中文,大写,符号,都无大小写之分)
比如:
select * from (select t1.*, rownum as 1234 from t1) where 1234 > 10 and 1234 <= 20; 会报错,因为1234不符合字段命名规则
select * from (select t1.*, rownum as "1234" from t1) where 1234 > 10 and 1234 <= 20; 查询为空,因为后一个1234会被认为是数字,而1234<= 20是一个恒false的条件
select * from (select t1.*, rownum as "1234" from t1) where "1234" > 10 and "1234" <= 20; 查询结果正常

‘玖’ oracle的实现分页功能的sql语句该怎么写

这种好费劲啊

selectt.*
from
(selectsalgrade.*,row_number()over(orderbyGRADE)rnfromsalgrade)t
wheret.rnbetween1and10--这样你可以查任意某几行的数据,这个就是1-10行的

‘拾’ 初学oracle,怎样写一个oracle分页sql语句

通过rownum来控制分页,下面是sql语句:

select * from ( select row_.*, rownum rownum_ from (
select * from 表名 (where条件略)

) row_ where 最大行数 >= rownum )
where rownum_ > 最小行数

通过这条语句你可以看到,sql语句、最大行、最小行
1. sql控制要通过什么样的条件,来筛选出符合条件记录,不多说了
2. 最大行数:你自己要计算的
3. 最小行数:也是你要计算的

比如:有150条记录,每页15条,通过计算共分为10页。
第1页:最小行数:(1-1)*10

最大行数:1*10;
第2页:最小行数:(2-1)*10
最大行数:2*10
。。。。
第n页:最小行数(n-1)*10
最大行数n*10

------------------------------------
仅供参考,不足之处,请多指教!

热点内容
死锁避免的算法 发布:2025-02-05 04:43:07 浏览:579
python查文档 发布:2025-02-05 04:27:49 浏览:496
javaxmldom 发布:2025-02-05 04:27:40 浏览:9
linux修改内存大小 发布:2025-02-05 04:26:05 浏览:997
ftp命令复制文件 发布:2025-02-05 04:26:00 浏览:303
python好用的ide 发布:2025-02-05 04:14:18 浏览:516
id密码开头是多少 发布:2025-02-05 04:11:51 浏览:101
数据结构c语言ppt 发布:2025-02-05 04:11:45 浏览:43
如何用学习机配置的笔写字 发布:2025-02-05 04:09:15 浏览:395
5岁编程 发布:2025-02-05 04:06:21 浏览:653