Structured Query Language 入门 oracle

今天总结一下oracle的sql 基础。

o count(1)(*)(column)的区别
o count 性能测试
o 求第 2 大的值(四种方法)
o SQL 完成日历
o 分组行列转换实验
o max(),min()的正确写法
o SQLERROR 和 OSERROR 处理实例
o 操作系统下执行 SQL
o Echo,Heading,Feedback,Termout,Trimspool 的作用
o 数值类型实验
o 字符隐式转换实验
o 数值类型性能测试
o UROWID 实验
o NVL 与 DECODE 的性能测试
o 数值类型实验
o 字符隐式转换实验
o 数值类型性能测试
o UROWID 实验
o NVL 与 DECODE 的性能测试
o DECODE 处理机制的区别
o 复杂的 DECODE
o CAST 的应用
o NUMTOYMINTERVAL 的异常

  sql的 英文是Structured Query Language  结构化查询语言,而不是过程化。
编程语言中的if......else if......else.....   就是 过程化的判断。
decode,case 就是结构化的语法。decode(表达式,条件1,结果1,条件2,结果2,...)中间有几个条件与结果根据个人而定
decode(sign(100-20),1,20,-1,100)意思是说当(100-20)大于零时,结果为20,而当(100-20)小于零时,结果为100,其中的sign只是一个判断符号的函数
假如要对一个企业的员工进行工资调整,对于3000块以下的提高10%,3000块以上的提高5%,那么如果用我们一般的做法就是对工资进行判断,
如果大于3000,就加5%,而低于3000的就加10%。不过现在有了这个Oracle decode函数,那么就可以简单的用下面的语句:
select decode(sign(salary-3000),1,salary*1.1,-1,salary*1.05) from employee
select decode( i, 5, 'five', 6, 'six', 'Else I just don''t know')    这里 don''t 实际返回的是 don't   引号里的字符串如果存在引号,则用两个引号来实现 

先创建一个方法:

create or replace function f return number

  as

  begin

    return 1/0;

  end;/  

nvl是滤空函数,就像sqlserver中的isnull 一样。 不过oracle中有nvl 和nvl2 两个。

在oracle 中 运行 select nvl(0,f()) from dual; 会报错。意思是但0 是null 的时候,就得到f() 方法的结果,要0不是null,就返回0本身。select nvl2(0,'not null',f())   两个在运行的时候是报错的,那是不是预编译的时候报错呢?不是,因为错误信息是:不能不被0 除。说明 0 不是null的情况下,f() 函数是运行了。

只能说明甲骨文在设计的时候就是这样,不管符合不符合条件,所有的方法都会运行,报错,说明我们的代码写的有缺陷。

select coalesce(0,f()) from dual; 返回第一个不是非空的值。 在9I 下是会报错的,但是在10G下是不会报错。

select coalesce(null,1,2,3,4) from dual;
select decode(0,0,'不执行 f()',f()) from dual;

 

posted @ 2013-11-10 08:38  洽洽果  阅读(389)  评论(0编辑  收藏  举报