Oracle查询优化改写2.0 第二章:给查询结果排序

------chapter2给查询结果排序
--2.1以指定的次序返回查询结果  order by xxx asc/desc
select empno,ename,hiredate from emp where deptno=10
order by hiredate asc;
其中 order by hiredate asc 还可以写成 order by 3 asc,意思是按照第三列升序。
使用 order by 3 asc 比较方便,
因为如果要增加列,使用的是 order by hiredate asc 需要修改 order by 后面的字段,将hiredate更换成其他字段。
需要注意的是,用数据代替列位置只能用于 order by 子句中,其他地方不能用。
--2.2按多个字段排序  oeder by xxx asc,yyy desc;
按照多列排序且有升有降怎么办?eg.按部门编号升序,按工资降序。
关键字 asc:升序  desc:降序
所以在order by 后面加两列,并分别标明 asc,desc。
select empno,deptno,sal,ename,,job from emp 
oeder by 2 asc,3 desc;
【注意】:按照多列排序时,若前面的列有重复值,后面的排序才有用。
也就是通过前面的列把数据分成了几组,每组的数据再按照按后面的列进行排序。
--2.3按子串排序 substr
比如按照客户电话号码的尾号的顺序记录,通过函数取出后面几位所需的信息即可。
select last_name as 名称,phone_number as 号码,salary as 工资,
substr(phone_number,-4) as 尾号
from hr.emplyees
where rownum<=5
order by 4 ;--4后面不加,就默认是asc
按子串排序实际就是增加一个计算列,然后用过这个计算列来排序。
--2.4从表中随机返回n条记录 dbms_random
为了防止作假,像前面那样抽查数据和还不行,还需要随机抽查。
先用dbms_random 对数据进行随机排序,然后取其中三行,每次数据都是不一样的。
正确示例:
select empno,ename
from
(select empno,ename from emp order by dbms_random.value())
where rownnum<=3;

错误示例:
select * from
(select empno,ename from emp where rownumm<=3 order by dbms_random.value)
order by 1; 

查询语句的执行顺序:1.select 2.rownum 3.order by
也就是说,先取出数据,然后生成序号,最后才是排序

正确的写法是:先随机排序,再取数据
错误的写法是:先取数据,再随机排序
--2.5translate
语法格式:translate(expr,from_string,to_string)
示例:select translate('ab 你好 bcdefg','abcdefg','1234567') as new_str from dual;--12 你好 234567

from_string 与 to_string以字符为单位,对应字符一一替换。
replace('a','1') 
如果to_string为空,则返回空值。
select translate('ab 你好 bcdefg','abcdefg','') as new_str from dual;--空
to_string对应的位置没有字符,则from_string中的列出的字符将会被消掉。
select translate('ab 你好 bcdefg','1abcdefg','1') as new_str from dual;-- 你好 
过程:1->1,a->空,b->空,c->空,d->空,e->空,f->空,g->空
--2.6按数字和字母混合字符串中的字母排序 translate
首先创建view:
create or replace view v2_6
as
select empno || '' ||ename as date from emp;--结果例如:7369 smith
按照其中的字母排序,那就要先取出其中的字母才行,我们可以用translate的替换功能,
把数字与空格都替换为空
select date,translate(date,'- 0123456789','-') as ename from v2_6 order by 2;
--2.7处理排序空值
oracle默认升序,默认空值在后,降序空值在前
select ename,mgr from emp where deptno=10 order bby mgr asc;--空值在最后
select ename,mgr from emp where deptno=10 order bby mgr desc;--空值在前面

想要更改空值的顺序,可以使用关键字 nulls first 和 nulls last
order by xxx asc nulls first;
order by xxx desc nulls last;

--2.8根据条件取不同列的值来排序 case when
比如:领导对工资在1000到2000之间的员工更感兴趣,要排在前面,以便优先查看。
对于这种需求,可以在查询中新生成1列,用多列排序的方法处理。
select empno as 编码,ename as 姓名,
case when sal>=1000 andd sal<=2000 then 1 else 2 end as 级别,
sal as 工资
from emp where deptno=30
order by 3,4;--升序,3相同时,4进行排序升序
----
也可以不显示级别
select empno as 编号,ename as 姓名,sal as 工资
from emp where deptno=30
order by case when sal>=1000 and sal<=2000 then  1 else 2 end,3; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值