以后要多写写博客了,收获知识做个小总结啦:
今天就开始了:
1.比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1比如:
SELECT DECODE(SIGN(&v1-&v2),1,&v1,&v2) FROM dual; --返回最大值。
输入&v1=10 &v2=20 查询结果20;
2.标准的 SQL 的解析顺序为:
(1).FROM 子句, 组装来自不同数据源的数据
(2).WHERE 子句, 基于指定的条件对记录进行筛选
(3).GROUP BY 子句, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER BY 对结果集进行排序
3.
in和exists (感谢junmail分享)
有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。
第一种格式是使用in操作符: ... where column in(select * from ... where ...);
第二种格式是使用exist操作符: ... where exists (select "x" from ...where ...);
绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在oracle中可以将几乎所有的in操作符子查询改写为使用exists的子查询。
通过使用exists,oracle系统会首先检查主查询,然后运行子查询直到找到第一个匹配项,这就节省了时间。oracle系统在执行in子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用exists比使用in通常查询速度快的原因。
同时应尽可能使用not exists来代替not in,尽管二者都使用了not(不能使用索引而降低速度),但not exists要比not in查询效率更高。
有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。
第一种格式是使用in操作符: ... where column in(select * from ... where ...);
第二种格式是使用exist操作符: ... where exists (select "x" from ...where ...);
绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在oracle中可以将几乎所有的in操作符子查询改写为使用exists的子查询。
通过使用exists,oracle系统会首先检查主查询,然后运行子查询直到找到第一个匹配项,这就节省了时间。oracle系统在执行in子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用exists比使用in通常查询速度快的原因。
同时应尽可能使用not exists来代替not in,尽管二者都使用了not(不能使用索引而降低速度),但not exists要比not in查询效率更高。