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 ‘\’

猜你喜欢

转载自blog.csdn.net/yhzhaohy/article/details/81018819