oracle常见到的函数

1.高级排序函数: 
   [ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx) 在使用时会产生行号。
  
  1.1 row_number() 连续且递增的数字 1 2 3 4 
        row_number() over (partition by xx order by xx )  
  1.2 rank() 跳跃排序 若有相同数据则排名相同 然后跳跃排序 1 2 2 2 5
        rank() over (partition by xx order by xx ) 
  1.3 dense_rank 若有相同数据则排名相同 然后递增排序
        dense_rank  over (partition by xx order by xx ) 1 2 2 2 3
  1.4 partition by 与  group by 的比较
       (1) partition by 用于对结果集进行分区,将原始数据进行排列,记录数不变
       (2) group by 是对原始数据进行聚合统计,记录可能变少,每一组数据返回一条
      
2.高级分组函数 
  2.1 group by rollup(a,b,c)
      对rollup后面的列 按从右到左以少一列的方式进行分组直到所有列都去掉后的分组(也就是全表分组),
      对于n个参数的 rollup,有n+1次分组,即按a,b,c,分组,union all a,b分组 union all a分组。
       
      案例:select a,b,c,sum(d) from test group by rollup(a,b,c)
  2.2 group by cube(a,b,c) 对n个参数,有2^n次分组,即按 ab,ac,a,bc,b,c最后对 全部分组
  2.3 group by grouping sets(a,b) 即只列出 对 a分组后,和对 b分组的结果集
    
3.开窗函数 和 分析函数
  3.1 说明:
      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,
      开窗函数不能单独使用,必须分分析函数一起使用。
  3.2 常见的分析函数
      rank(),dense_rank(),row_number()等
  3.3 常见的开窗函数
      over()等
  3.4 开窗函数的调用格式为: 函数名(列) OVER(选项)
      
      (1)OVER keyword表示把函数当成开窗函数而不是聚合函数。
      (2)SQL  标准同意将全部聚合函数用做开窗函数,使用OVER keyword来区分这两种使用方法。 
      (3)OVER keyword后的括号里还常常加入选项用以改变进行聚合运算的窗口范围,
         假设OVER keyword后的括号里的选项为空,则开窗函数会对结果集中的全部行进。
         
      案例1: select p.fcity,  p.fname,count(*)over() from t_person p where p.fsalary < 5000;
             开窗函数COUNT(*)OVER()对于查询结果的每一行都返回全部符合条件的行的条数。
      案例2: over(partition by deptno)
             按照部门分区       
      案例3: sum(s)over(order by s range between 2 preceding and 2 following) 
             表示加2或2的范围内的求和
      案例4: sum(s)over(order by s rows between 2 preceding and 2 following) 
             表示在上下两行之间的范围内 
      案例5:row_number(partition by ## order by ## ) rn 分区排序
4.常用的函数功能与作用
  函数主要分为两大类:单行函数 组函数;
  SQL和PL/SQL中自带很多类型的函数,有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数
  
 (1)TO_CHAR(sysdate,'yyyy-MM-dd hh24:mi:ss');  日期转换字符串
    SELECT TO_CHAR(sysdate ,'yyyy-MM-dd hh24:mi:ss') FROM DUAL;
 (2)TO_DATE('2018-10-24 18:30:59','yyyy-MM-dd hh24:mi:ss') 时间字符串转换日期
    SELECT TO_DATE('2018-10-24 18:30:59','yyyy-MM-dd hh24:mi:ss') FROM DUAL;
 (3)TO_NUMBER('123') 将字符串的字段转换成数字
    SELECT TO_NUMBER('123') FROM DUAL;
 (4)CONCAT('ABC','def') 字符串拼接
    SELECT CONCAT('ABC','def') FROM DUAL;
 (5)DECODE(value, if1, then1, if2,then2, if3,then3, . . . else ) 对value值进行转换
    select decode('1','1','abc','def') from dual;
 (6)NVL 从两个表达式返回一个非 null 值,若两个都为空则返回空,''oracle默认为null,与带空格 ' '不是一回事
    select nvl('','124') from dual;
 (7)REPLACE ( char, search_string [, replace_string])
    select REPLACE('123','1','a') from dual;

      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

猜你喜欢

转载自blog.csdn.net/iss_jin/article/details/86551217