对应的第一章”单表查询“
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 ‘\’