oracle如何进行分页查询(如何实现Oracle数据库的分页显示)
本文目录
- 如何实现Oracle数据库的分页显示
- Oracle 分页查询rownum的用法
- oracle使用(五)_子查询_分页rownum
- oracle和mysql的分页查询怎么写
- oracle怎么实现多表 连接查询 并分页
- Oracle常见SQL分页实现方案
- oracle 高效分页查询SQL
- 论述Oracle分页查询的几种方式
- oracle分页查询语句怎么写每页查询10条
- Oracle数据库中如何快速查询分页
如何实现Oracle数据库的分页显示
1.使用T_BASE_PROVINCE表作为测试演示使用
***隐藏网址***
2.查询下总共数据量selectcount(*)fromT_BASE_PROVINCE,在分页的时候,一般会显示总页数,需要先查询总数据量得到总页数,总页数=总量/每页显示记录数。
***隐藏网址***
3.前面的测试数据初始化完成之后,查询前20条大概有什么样的数据。
***隐藏网址***
4.含orderby排序,多一层嵌套,因为orderby在select之后执行,不在里面写的话可能会出现不是预期的排序结果。
***隐藏网址***
Oracle 分页查询rownum的用法
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。 (1) rownum 对于等于某值的查询条件 如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n》1的自然数)。 SQL》 select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标) SQL》 select rownum,id,name from student where rownum =2; ROWNUM ID NAME ---------- ------ --------------------------------------------------- (2)rownum对于大于某值的查询条件 如果想找到从第二行记录以后的记录,当使用rownum》2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum》 n(n》1的自然数)这种条件依旧不成立,所以查不到记录。 查找到第二行以后的记录可使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。 SQL》select * from(select rownum no ,id,name from student) where no》2; NO ID NAME ---------- ------ --------------------------------------------------- 3 200003 李三 4 200004 赵四 (3)rownum对于小于某值的查询条件 rownum对于rownum 1的自然数)的条件认为是成立的,所以可以找到记录。 SQL》 select rownum,id,name from student where rownum select * from (select rownum no,id,name from student where rownum=2; NO ID NAME ---------- ------ --------------------------------------------------- 2 200002 王二 3 200003 李三 (4)rownum和排序 Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。 SQL》 select rownum ,id,name from student order by name; ROWNUM ID NAME ---------- ------ --------------------------------------------------- 3 200003 李三 2 200002 王二 1 200001 张一 4 200004 赵四 可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询; SQL》 select rownum ,id,name from (select * from student order by name); ROWNUM ID NAME ---------- ------ --------------------------------------------------- 1 200003 李三 2 200002 王二 3 200001 张一 4 200004 赵四 这样就成了按name排序,并且用rownum标出正确序号(有小到大)
oracle使用(五)_子查询_分页rownum
sql允许多次嵌套,子查询即嵌套其他查询中得查询 可把子查询返回结果理解成一张表,外层查询会把子查询返回的结果当成一张表 子查询要用括号括起来 将子查询放在比较运算符的右边,增强可读性 子查询的分类: 单行子查询:子查询返回一行记录,可使用单行比较运算符 多行子查询:子查询返回多行记录 --有哪些雇员薪水在平均薪水之上 --1、先求平均薪水 select avg(nvl(e.sal,0)) from emp e; --2.把所有人的薪水和平均薪水作比较,使用的单行比较运算符 select * from emp e where e.sal 》 (select avg(nvl(e.sal,0)) from emp e); -- 查询雇员表哪些人是经理人 -- 1.先查询所有经理人 distinct去重(多行子查询) select distinct e.mgr from emp e; --2.在雇员表中过滤是经理的 select * from emp where empno in (select distinct e.mgr from emp e); -- 每个部门的平均薪水等级 --1.求出每个部门的平均薪水等级 select e.deptno,avg(nvl(e.sal,0)) from emp e group by e.deptno; --2.根据部门平均薪水断出薪水等级 select g.deptno,sg.grade from salgrade sg join (select e.deptno,avg(nvl(e.sal,0)) avgsal from emp e group by e.deptno) g on g.avgsal between sg.losal and sg.hisal; --1.求平均薪水最高的部门的部门编号 -- 求部门平均薪水 select e.deptno,avg(nvl(e.sal,0)) from emp e group by e.deptno; -- 求最高的薪水 select max(t.vsal) from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t; -- 求部门编号(重复的sql可以抽取为视图) select t.deptno,t.vsal from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t where t.vsal = (select max(t.vsal) from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t); ) --2.求部门的平均薪水的等级 --3.求部门平均的薪水等级 (薪水等级的平均) --求每个人的薪水等级 select e.deptno, sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal; --求部门的平均薪水等级 select t.deptno, avg(t.grade) from (select e.deptno, sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal) t group by t.deptno; --4.求薪水最高的前5名员工 -- 所有员工薪水降序 select * from emp e order by e.sal desc; -- oracle中没有limit子句,rownum只存在于查询出来的虚拟表中 select * from (select * from emp e order by e.sal desc) t where rownum 《=5; --5.求薪水最高的第6到10名 -- 默认对于基表 rownum,跟插入顺序有关 select rownum rn,t.* from emp t; -- 对于子查询rownum跟内层查询的顺序有关 --rn顺序是根据内层查询记录进行分配的 select rownum rn,t.* from (select * from emp e order by e.sal desc) t; -- 根据rn顺序来过滤第6到10条 select * from (select rownum rn,t.* from (select * from emp e order by e.sal desc) t) t1 where t1.rn 》5 and t1.rn 《=10;
oracle和mysql的分页查询怎么写
可以根据下面操作进行编写。
1.#返回前5行 Mssql 2000分页采用top关键字(20005以上版本也支持关键字Select top 10 * from t_order where id not in (select id from t_order where id》5 )。
2.Oracle分页采用rownum关键字(三层嵌套) SELECT * FROM( SELECT A.*,ROWNUM num FROM (SELECT * FROM t_order)A WHERE ROWNUM《=15) WHERE num》=5;--返回第5-15行数据。
3.采用row_number解析函数进行分页(效率更高) SELECT xx.* FROM --返回第5-15行数据 解析函数能用格式 函数over(pertion by 字段 order by 字段)。
4.Pertion 按照某个字段分区 Order 按照勒个字段排序。
oracle怎么实现多表 连接查询 并分页
oracle使用rownum伪列可以实现分页,三表连接分页示例代码如下:
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常见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 高效分页查询SQL
因为一个功能需要读取一个大表的所有数据做业务处理,那这样肯定不能一次性查出所有数据,需要程序分页查询处理,模拟测试一个200万数据量的表发现耗时很久,并不是业务处理耗时,而且分页查询耗时了。oracle的分页查询可能大家都知道利用rownum,而且大部分公司这种分页都是底层封装好的了,所有平时大家使用的时候也没注意(这次之后特意留意了一下,我们公司就是用了错误的) 这两条查询语句看着区别不大,但是性能却差很多。经过测试第一种性能最好,而且随着数量的增大,几乎不受影响。第二种随着数据量的增大,查询速度也越来越慢。表200W条数据的情况下,第一种查询耗时基本是0.3s,第二种基本在1.3s以上。一个查询足足差了一秒。别小看这1秒。200W条数据每次查询1000条,查询完也差了2000s=33分钟. 分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM 《= 20这句上。 这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。 对于正确有order by语句,第二层的查询条件WHERE ROWNUM 《= 20就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了 对于错误有order by 语句,由于查询条件where b.rowno 》= 11 and b.rowno 《= 20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道b.rowno代表什么)。因此对于这个语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。 上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
论述Oracle分页查询的几种方式
oracle,sqlserver和mysql的分页sql语句如下:oracle:方法一:select*from(selecta.*,rownumrnfrom(select*fromtable_name)awhererownum《=40)wherern=21;方法二:select*from(selecta.*,rownumrnfrom(select*fromtable_name)a)wherernbetween21and40公认第二种方法效率没有第一种高。原因是第二种要把子查询执行完,而第一种方法子查询执行到rownum=40后就结束了。mysql:select*fromtable_namelimit10,20表示从第11条数据开始取20条数据返回,limit后的2个参数含义为:起点和步长,即从那条数据开始,取多少条数据,再如取前20条数据:select*fromtable_namelimit0,20sqlserver2000:selecttop@pagesize*fromtable_namewhereidnotin(selecttop@pagesize*(@page-1)idfromtable_nameorderbyid)orderbyid
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 bwhere a.rid = b.rowid;
Oracle数据库中如何快速查询分页
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如何进行分页查询(oracle怎么实现多表 连接查询 并分页)
2024年8月29日 04:45
oracle如何进行分页查询(论述Oracle分页查询的几种方式)
2024年7月22日 02:02
更多文章:
ueditor开发文档(有没有用百度Ueditor的,关于编辑文档字数限制的配置问题)
2024年9月5日 23:00
proposal模板范文(本科论文开题报告中研究计划怎么写)
2024年7月7日 06:45
css绝对定位(html\u002Fcss因绝对定位而导致内容不显示怎么办)
2023年5月24日 07:00
浮点型变量存入整型变量(c语言 向浮点型变量里输入整型数据)
2024年8月3日 15:10
witnessed是什么意思中文(witnessed by是什么意思)
2024年7月14日 05:17
18岁女rapperdisssubs(介绍下欧美女rapper都有谁)
2024年5月8日 13:41
四平青年第二部叫什么?四平青年第二部上浩哥他们几个在皮卡车上唱的那个曲叫啥名,知道的给我回复一下,谢谢
2024年6月27日 07:59
python中exit函数(python中exit()函数怎么不能退出进程)
2024年6月27日 17:18
explicit什么意思(Itunes里的explicit和clean是什么意思)
2024年7月7日 11:33