Oracle SQL基础
1、nvl('A','B') 如果a为null,则显示B 2、DECODE(value, if1, then1, if2,then2, if3,then3, . . . else ) 3、grouping函数用法,带一个参数,参数为字段名,结果是根据该字段得出来的就返回1,反之返回0 4、Over over不能单独使用,要和分析函数:rank(),d
1、nvl('A','B') 如果a为null,则显示B
2、DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
3、grouping函数用法,带一个参数,参数为字段名,结果是根据该字段得出来的就返回1,反之返回0
4、Over
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by col1 order by col2)
含义:按col1指定的字段进行分组,然后再按照col2进行排序
4、开窗函数:rank() over ( partition by [col1],[col2]... by [col3]desc)
rank,dense_rank,row_number的区别:
结果集中如果出现两个相同的数据,那么rank会进行跳跃式的排名,
比如两个第二,那么没有第三接下来就是第四;
但是dense_rank不会跳跃式的排名,两个第二接下来还是第三;
row_number最牛,即使两个数据相同,排名也不一样。
5、distinct 去重复
6、Lag和Lead函数可以在一次查询中取出某个字段的前N行和后N行的数据(可以是其他字段的数据,,比如根据字段甲查询上一行或下两行的字段乙),原来没有分析函数的时候采用子查询方法,但是比较麻烦,惭愧,我用子查询有的还查不出来呢。
语法如下:
lag(value_expression [,offset] [,default]) over ([query_partition_clase] order_by_clause);
lead(value_expression [,offset] [,default]) over ([query_partition_clase] order_by_clause);
其中:
value_expression:可以是一个字段或一个内建函数。
offset是正整数,默认为1,指往前或往后几点记录.因组内第一个条记录没有之前的行,最后一行没有之后的行,
default就是用于处理这样的信息,默认为空。
求出每个打工者上个月和下个月有没有赚钱(personincome大于零即为赚钱)
select distinct earnmonth,sname, lag(decode(nvl(personincome,,),1,0) over(partition by sname order by earnmonth) PerMonth, lead(decode(nvl(personincome,,),1,0) over(partition by sname order by earnmonth) NextMonth from earnings;
详细内容:
7、两种CASE
简单case:
CASE search_expression WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN resultN ELSE default_result
如果search_expression 是null,则会走ELSE,不会进行其他匹配,而decode无此问题。
搜索case:
直接使用case when +比较条件 到end为返回的结果,end之后可以做运算。
语法:
case when Boolean then returnvalue when Boolean then return value ... Else Returnvalue End