ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle 常用函数

2022-08-21 17:34:39  阅读:237  来源: 互联网

标签:常用 函数 clause expr1 分组 Oracle pivot SELECT


 

单行函数

  1. 操作数据对象
  2. 接受参数返回一个结果
  3.  只对一行进行变换
  4.  每行返回一个结果
  5. 可以转换数据类型
  6. 可以嵌套
  7. 参数可以是一列或一个值

 格式

    

 

字符函数

 

 

 

 

 

 

 

 数字函数

 

 

 

 

 

 TRUNC:     截断
TRUNC(45.926, 2)            45.92

 

 

 日期函数

Oracle 中的日期型数据实际含有两个值: 日期和时间

日期默认格式:DD-MON月-RR

     • 在日期上加上或减去一个数字结果仍为日期。
    • 两个日期相减返回日期之间相差的天数。
    • 日期间不允许做加法运算,无意义
    • 可以用数字除24来向日期中加上或减去天数

 

 

 

 

 

 

 

 

 

注意分钟是mi

 

显示转换函数

 

 

 

 

 

to_char

对金额

 

 

 

 

 

 

--  $000,123.14
SELECT TO_CHAR(123.14, '$000,000.99') from dual;
-- $123.14 select TO_CHAR(123.14,'$999,999.99') from dual; --  ¥000,123.14 SELECT TO_CHAR(123.14, 'L000,000.99') from dual;

 

对日期

 

 

 

 

 

 

 

 

 

--  2022-08-21 05:13:36

SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') FROM dual;

-- 2022-08-21 17:15:59
 SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM dual;

 

 

其他可参考:https://www.cnblogs.com/yuan88008/p/15597988.html

 

条件函数

NVL (expr1, expr2)  前面为空,用后面替代
NVL2 (expr1, expr2, expr3) expr1不为空,expr2,为空则exper3
NULLIF (expr1, expr2) 相等返回Null,不等返回expr1
COALESCE (expr1, expr2, ..., exprn) expr1为空则判断expr2,知道不为空就返回

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

含义:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF

行转列函数

pivot

语法

SELECT * FROM (数据查询集)
PIVOT
(
 SUM(Score/*行转列后 列的值*/) FOR
 coursename/*需要行转列的列*/ IN (转为列的值[ as 列名])
)

 

eg:

SQL> SELECT job
  2  ,      deptno
  3  ,      SUM(sal) AS sum_sal
  4  FROM   emp
  5  GROUP  BY
  6         job
  7  ,      deptno
  8  ORDER  BY
  9         job
 10  ,      deptno;

JOB           DEPTNO    SUM_SAL
--------- ---------- ----------
ANALYST           20       6600
CLERK             10       1430
CLERK             20       2090
CLERK             30       1045
MANAGER           10       2695
MANAGER           20     3272.5
MANAGER           30       3135
PRESIDENT         10       5500
SALESMAN          30       6160
SQL> WITH pivot_data AS (
  2          SELECT deptno, job, sal
  3          FROM   emp
  4          )
  5  SELECT *
  6  FROM   pivot_data
  7  PIVOT (
  8             SUM(sal)        --<-- pivot_clause
  9         FOR deptno          --<-- pivot_for_clause
 10         IN  (10,20,30,40)   --<-- pivot_in_clause
 11        );

JOB               10         20         30         40
--------- ---------- ---------- ---------- ----------
CLERK           1430       2090       1045
SALESMAN                              6160
PRESIDENT       5500
MANAGER         2695     3272.5       3135
ANALYST                    6600

5 rows selected.

pivot_clause:定义要聚合的列(pivot 是聚合操作)
pivot_for_clause:定义要分组和旋转的列;
pivot_in_clause:为 pivot_for_clause 中的列定义过滤器(即限制结果的值范围)。 pivot_in_clause 中每个值的聚合将被转置到单独的列中(在适当的情况下)。
对pivot函数的理解:对于非pivot_for_clause列来说,按其所对应pivot_for_clause列的值pivot_in_clause来分组,计算后的值pivot_clause为 (pivot_in_clause值作为的)新列下的新值,
pivot_for_clause列拥有所有这些(不同pivot_in_clause)作为的新列,即便有些新列下的值为空,因为非pivot_for_clause列对应的pivot_for_clause列下可能没有pivot_in_clause中的某些值
隐含分组-》按非pivot_for_clause列非pivot_clause列进行分组,再按pivot_in_clause值对pivot_clause进行分组聚合

分组函数

分组排序 :

  ROW_NUMBER() OVER (PARTITION BY 字段1 ORDER BY 字段2 DESC)   , 顺序: 1,2,3,4...n
  RANK() OVER(PARTITION BY 字段1 ORDER BY 字段2 DESC), 相同的为同一序次,且下一个依旧按照总的顺序,即序号不连续,会发生跳跃 :1,2,3,3,3,6,7...n

  DENSE_RANK() OVER(PARTITION BY 字段1 ORDER BY 字段2 DESC),区别于rank是序号始终连续,不会发生跳跃 : 1,2,2,2,3,4....n

 

 分组聚合拼接某列值

LISTAGG函数可以指定具有相同属性的数据进行拼接  行转列

listagg(要行转列聚合的列的列名,‘分隔符’)within group(order by 按照该列排序的列名)  , 配合group by使用=》分组聚合行转列

 

 select TID,listagg(LOC,',')within group(order by DEPTNO) LOC_AGG from DEPT
GROUP BY TID;

 

 order by 倒序

 

标签:常用,函数,clause,expr1,分组,Oracle,pivot,SELECT
来源: https://www.cnblogs.com/deity-night/p/16600523.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有