Oracle查询优化改写_1

对应的第一章”单表查询“


1.将空值转换为实际值

和nvl函数相比,coalesce函数更好用,后者支持多个参数。

COALESCE
语法:COALESCE(exp1,exp2,exp3,...)
功能:9i新增,依次查找各参数,遇到非NULL则返回,各参数或表达式数据类型必须一致,如果都为null则返回null

如果nvl要实现相同的功能,则需要嵌套多层。

select nvl(nvl(ex1,ex2),ex3) AS ex from dual;
2.在where子句中引用取别名的列

引用别名时候需要嵌套一层,别名是在select之后才有效的。

select * from (select sal as 工资,comm as 提成 from emp) e where 工资 < 1000;

如果为嵌套,像下面的sql一样,则会报错
select sal as 工资,comm as 提成 from emp where 工资 < 1000;

==报错:“工资”标识符无效。==

3.限制返回行数

使用伪劣rownum来过滤,rownum依次对返回的每一条数据做一个标识。

select * from emp where rownum <= 2;

如果使用rownum = 2,此时查询失败。因为rownum是依次对数据做标识的,即需要有第一,才能有第二,所以需要把所有的数据取出来才可以确定第二行。

正确的取第二行数据的查询sql应该为:

select * from (select rownum as rn ,emp.* from emp where rownum <= 2) where rn = 2;
4.从表中随机返回n条记录

先写出来正确的sql:

select empno,empname 
    from(select empno,empname from emp order by dbms_random.value())
    where rownum <= 3;

此时会有疑问,为什么要嵌套一层呢?

下面的sql不就可以了?

==错误示例==

select empno,empname from emp where rownum <= 3 order by dbms_random.value;

多执行几次上述sql,发现查出来的结果,每次都是一样的,而不是随机的。

这是因为错误的示例,SQL执行顺序是

①SELECT

②ROWNUM

③ORDER BY

也就是说,错误的示例是先取出数据,生成序号,最后才排序的。

正确的查询方法,应该是:先随机排序,再取出数据。

5.模糊查询

%:零个或多个任意字符

_:单个任意字符

1)查询包含字符串”_BCD”

此时查询条件为: LIKE ‘%_BCD%’ ESCAPE ‘\’

==++ESCAPE++把’\’标识为转义字符,而’\’把’_’转义为字符,而非其原义(通配符)==

2)查询包含字符串①”_\BCD” ②”%BCD”

此时查询条件为: ①LIKE ‘%_\BCD%’ ESCAPE ‘\’ ②LIKE ‘%\%BCD%’ ESCAPE ‘\’

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值