Oracle查询优化改写——抄书学习05

第九章 范围处理

**9.1定位连续值的范围
9.2查找同一组或分区中行之间的差
9.3定位连续值范围的开始点和结束点
9.4合并时间段**		   

第十章 高级查找

(前几章比较懒了,所以后面这几章决定要好好写写)
10.1 给结果集分页
为了方便查询网页的数据,常常要分页显示,如:求员工表EMP,安公子排序后一次只显示5行数据,下次在显示接下来的5行
下面以第二页数据(6到10行)为例进行分页
1.要进行排序,然后在外层生成正确的序号:
select rn as 序号,ename as 姓名 , sal as 工资
/3. 根据前面的生成序号过滤掉6行以后的数据 /
from (select row num as rn, sal ,ename
/
2.取得排序号的序号,并过滤掉10行以后的数据
/

   from (select sal , ename from emp where  sal is not null order by sal) x
    where  rownum <= 10)
     where rn >=6;
     效果图如下
     序号               姓名                工资
     6					aa				1300.00
     7					nn              1500.00
     ...				..				.......
     10                 33              2850.00
     提问1:为什么不直接在内层应用条件“whererownum<=10”呢?
     可以说,内层直接生成的rownum()与sal的顺序不一样,要想得到正确的顺序,就要线排序,后取序号。
     提问2:为什么不直接用rownum<=10 and rownum<=6 而是分开写呢?
     rownum是一个伪列,需要取出数据后,rownum才会有值,在执行“where rownum >=6”时,因为始终没取
     出数据来,所以这个条件就产寻不到数据,所以需要在子查询中取出数据,然后外层“where rn>=6” 来过滤。

10.2重新生成房间号
现有房间号数据如下
 create table hotel (floor_nbr,room_nbr) as
 select 1,100 from dual union all
 select 1,100 from dual union all
 select 2,100 from dual union all
 select 2,100 from dual union all
 select 3,100 from dual ;
 房间号不对,正常应该是101,102,,201,202 形式,现在要重新生成。
 update 一般用merge
merge into  hotel a
using (select rowid as rid,
	(floor_nbr*100) + row_number( ) over (partition by floor_nbr order by rowid) as room_nbr from hotel )b
	on (a.rowid =b.rowid)
	when matched then 
	update set a.room_nbr =b.room_nbr;
	结果:
	floor_nbr   room_nbr
	1    		101
	2			102		
	3			201		
	4			202	
	5			301
	因为merge 快,只对数据库访问一次
10.3跳过表中n行
有时候为了取样而不是查看所有数据,要对数据进行抽样,隔行返回一条信息
为了实现目标,用求余函数mod即可,看一下mod的结果
select empno,ename,sal, mod(rn,2)as m
from (select rownum as rn,empno,ename,sal
	from (select empno,ename,sal from emp order by enme) x )y;
	empno 	ename 	sal 	m
	7876 	adams  1100		1
	7499	allen  1600		0
	7698	blacke 2850		1
	7782	clake	2450    0
	....

	对返回的数据增加过滤条件即可
	select empno,ename,sal, mod(rn,2)as m
from (select rownum as rn,empno,ename,sal
	from (select empno,ename,sal from emp order by enme) x )y
	where mod(rn,2)= 1;
	ename   M
	ADAMS   1
	blacke  1

	通过函数,你想隔几行返回都能实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值