• 【Oracle数据库系列笔记】单行函数


    基本概念

    函数是具有一定功能,被事先封装好的功能块,通过在PL/SQL或SQL语句中使用函数可以完成以下的一系列功能:

    1. 进行数据运算,比如MOD求余;
    2. 修改单个数据项,比如使用ROUND对数字进行四舍五入;
    3. 操纵输出进行数据行分组,比如使用SUM、AVG进行查询分组;
    4. 格式化显示的日期和数字,比如使用TO_CHAR格式化显示的日期;
    5. 转换列的数据类型,比如使用TO_DATE将字符型的日期转换为日期型。

    ORACLE提供很多功能强大的内置函数,在进行数据库操作的时候,可以很方便地使用这些函数来操纵数据。

    在SQL中,函数分为两种类型:

    • 单行函数:仅针对单个的值进行计算、并且对每行返回一个结果。单行函数包含字符、数字、日期、转换函数等
    • 多行函数:能够操纵成组的行,给每一个组一个结果,比如聚合函数SUM、AVG等

    本节笔记介绍了单行函数。多行函数将会在下一节笔记中进行介绍。

    单行函数

    字符型函数

    字符型函数的作用是接受字符输入,可以返回字符或数字值。字符型函数包括大小写转换函数和字符处理函数:

    • LOWER():将特定的字符串转换为小写,只影响字母字符串
    • UPPER():将特定的字符串转换为大写,只影响字母字符串
    • INITCAP():将字符串中每一个单词的第一个字母转换为大写,其他的均为小写,只影响字母字符串
    • CONCAT(x,y):用来连接两个特定的字符,与"||"的功能相同(只能连接两个特定字符)
    • SUBSTR():返回字符串的一部分
    • LENGTH():返回字符串的长度,包括填充的字符
    • INSTR(x,y):返回y在x中的位置,如果y不在x中,则返回0
    • LPAD(x,i,y):用字符串y按照指定填充数i填充x的左边
    • RPAD(x,i,y):用字符串y按照指定填充数i填充x的右边
    • LTRIM():裁剪字符串左边的字符
    • RTRIM():裁剪字符串右边的字符
    • TRIM():裁剪字符串两边的字符,可以说是LTRIM和RTRIM的组合

    示例如下:

    -- LOWER(),将特定的字符串转换为小写,只影响字母字符串
    SELECT LOWER('ABCDE1323FxcdG') FROM dual;
    
    -- UPPER(),将特定的字符串转换为大写,只影响字母字符串
    SELECT UPPER('ABCDE1323FxcdG') FROM dual;
    
    -- INITCAP(),将字符串中每一个单词的第一个字母转换为大写,其他的均为小写,只影响字母字符串
    SELECT INITCAP('this is a strings!') FROM dual;
    SELECT table_name,owner FROM dba_tables WHERE lower(table_name)='emp';
    SELECT INITCAP('morgan freeman') FROM dual;
    
    -- CONCAT(x,y),用来连接两个特定的字符,与"||"的功能相同(只能连接两个特定字符)
    SELECT CONCAT('abc','def','efg') FROM dual;
    
    -- SUBSTR(),返回字符串的一部分
    SELECT SUBSTR('THIS IS A STRINGS!',1,5) FROM dual;
    SELECT SUBSTR('THIS IS A STRINGS!',5) FROM dual;
    SELECT SUBSTR('THIS IS A STRINGS!',5,LENGTH('THIS IS A STRINGS!')-1) FROM dual;
    
    -- LENGTH(),返回字符串的长度,包括填充的字符
    SELECT LENGTH('THIS IS A STRINGS!') FROM dual;
    
    -- INSTR(x,y),返回y在x中的位置,如果y不在x中,则返回0
    SELECT INSTR('THIS IS A STRINGS!','H') FROM dual;
    
    -- LPAD(x,i,y),用字符串y按照指定填充数i填充x的左边
    SELECT LPAD(ename,6,' ') FROM scott.emp;
    
    -- RPAD(x,i,y),用字符串y按照指定填充数i填充x的右边
    SELECT RPAD(ename,6,' ') FROM scott.emp;
    
    -- LTRIM(),裁剪字符串左边的字符
    SELECT LTRIM('    asdff     ') FROM dual;
    
    -- RTRIM(),裁剪字符串右边的字符
    SELECT RTRIM('    asdff     ') FROM dual;
    
    -- TRIM(),裁剪字符串两边的字符,可以说是LTRIM和RTRIM的组合
    SELECT TRIM('    asdff     ') FROM dual;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    数字型函数

    数字型函数的作用是接受数字的输入,并且返回数字值。数字型函数包括:

    • ROUND(x,y),四舍五入x的值为y位的小数位;如果y忽略,则无小数位;如果y为负数,则小数点左边的
      数将被四舍五入
    • TRUNC(x,y),截断x的值到y位的小数,如果y被忽略,那么y的默认值是0
    • MOD(x,y),取模,即求余,求得x除以y的余数
    • POWER(x,y),返回x的y次幂
    • SIGN(x),返回x的正负值,如果正值返回1,负值返回0,0返回0

    示例如下:

    -- ROUND(x,y),四舍五入x的值为y位的小数位;如果y忽略,则无小数位;如果y为负数,则小数点左边的数将被四舍五入
    SELECT ROUND(12345.67) FROM dual;
    SELECT ROUND(12345.67,1) FROM dual;
    SELECT ROUND(12345.67,-1) FROM dual;
    
    -- TRUNC(x,y),截断x的值到y位的小数,如果y被忽略,那么y的默认值是0
    SELECT TRUNC(12345.67) FROM dual;
    SELECT TRUNC(12345.67,1) FROM dual;
    SELECT TRUNC(12345.67,-1) FROM dual;
    
    -- MOD(x,y),取模,即求余,求得x除以y的余数
    SELECT MOD(100,3) FROM dual;
    SELECT TRUNC(100/3) FROM dual;
    
    -- POWER(x,y),返回x的y次幂
    SELECT POWER(2,10) FROM dual;
    
    -- SIGN(x),返回x的正负值,如果正值返回1,负值返回-1,0返回0
    SELECT SIGN(-100 ) FROM dual;
    SELECT SIGN(100 ) FROM dual;
    SELECT SIGN(0 ) FROM dual;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    日期函数

    日期函数用于日期的格式化显示。ORACLE默认的日期格式是’DD-MON-RR’:

    SELECT * FROM v$nls_parameters WHERE parameter='NLS_DATE_PARAMETER';
    
    • 1

    我们可以更改nls_date_format参数来更改当前会话显示的日期格式:

     alter SESSION SET nls_date_format='yyyy-mm-dd hh24:mi:ss';
    
    • 1

    日期函数主要包括:

    • SYSDATE:返回当前数据库服务器的日期和时间
    • MONTHS_BETWEEN(date1,date2):计算date1和date2之间的月数,他们两个之间的差可以为正也可以
      为负
    • ADD_MONTHS(date,n):添加n个月到date,n必须是整数(可以是负数)
    • NEXT_DAY(date,‘char’):计算在date之后的下一个周(‘char’)的指定天的日期,char的值可能是一个表示
      一天的书或者是一个字符串
    • LAST_DAY(date):计算包含date的月的最后一天的日期
    • ROUND(date,[‘format’]):返回格式化模式format四舍五入到指定单位的date,如果format忽略,那么四
      舍五入到最近的天
    • TRUNC(date,[‘format’]):返回格式化模式format截断到指定单位的带天的时间部分的date,如果format忽略,date被截断到最近的天

    日期的运算:

    • 日期加减一个数,得到一个日期值;
    • 两个日期相减得到两个日期之间的天数;
    • 用小时数除以24,可以将小时数加到日期上。

    常用的ORACLE日期格式:

    • cc,世纪
    • q,季度
    • yyyy,年份
    • yy,两位数的年份
    • rrrr,年份
    • rr,年份两位数的年份
    • year,年份的全拼
    • mm,月份
    • month,月份的全拼
    • mon,月份的前三个字母
    • ww/w,当前所属年的第几周
    • ddd,当前所属年的第几天
    • dd,当前所属月的第几天
    • d,当前所属周的第几天
    • day,周几的全拼
    • dy,周几的前三个字母
    • hh24,24小时格式的小时
    • hh,12小时格式的小时
    • mi,分
    • ss,秒
    • ms,毫秒
    • am,上午
    • pm,下午

    基于日期函数的日期显示示例如下:

    -- 常用的ORACLE日期格式:
    -- cc,世纪
    -- q,季度
    -- yyyy,四位数的年份
    -- yy,两位数的年份
    -- rrrr,四位数的年份
    -- rr,两位数的年份
    SELECT TO_DATE('05/01/02','YYYY-MM-DD') YYYY ,TO_DATE ('05/01/02','RRRR-MM-DD') RRRR FROM dual;
      -- RRRR,如果输入的是2位数字则会转换为四位年,如果是四位年,则保持不变
      -- YYYY,只是将同一位置上的字符转换为要求的字符,如果位数数不够则用0补充
    
    -- year,年份的全拼
    SELECT to_char(SYSDATE,'year') FROM dual;
    
    -- mm,月份
    SELECT to_char(SYSDATE,'mm') FROM dual;
    
    -- month,月份的全拼
    SELECT to_char(SYSDATE,'month') FROM dual;
    SELECT to_char(SYSDATE,'Month') FROM dual;
    SELECT to_char(SYSDATE,'MONTH') FROM dual;
    
    -- mon,月份的前三个字母
    
    -- ww/w,当前所属年的第几周
    SELECT to_char(SYSDATE,'ww') FROM dual;
    
    -- ddd,当前所属年的第几天
    SELECT to_char(SYSDATE,'ddd') FROM dual;
    
    -- dd,当前所属月的第几天
    SELECT to_char(SYSDATE,'dd') FROM dual;
    
    -- d,当前所属周的第几天
    SELECT to_char(SYSDATE,'d') FROM dual;
    
    -- day,周几的全拼
    -- dy,周几的前三个字母
    
    -- hh24,24小时格式的小时
    -- hh,12小时格式的小时
    -- mi,分
    -- ss,秒
    -- ms,毫秒
    SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;
    -- am,上午
    -- pm,下午
    
    -- ORACLE默认的日期格式是'DD-MON-RR'
    SELECT SYSDATE FROM dual;
    SELECT * FROM v$nls_parameters WHERE parameter='NLS_DATE_FORMAT';
    
    -- 可以更改nls_date_format参数来更改当前会话显示的日期格式
    ALTER SESSION SET nls_date_format='yyyy-mm-dd hh24:mi:ss';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    基于日期函数的日期运算示例如下:

    -- SYSDATE,返回当前数据库服务器的日期和时间
    SELECT SYSDATE FROM dual;
    
    -- 日期加减一个数,得到一个日期值;两个日期相减得到两个日期之间的天数;用小时数除以24,可以将小时数加到日期上;
    SELECT SYSDATE+7 FROM dual;
    SELECT SYSDATE-to_date('1997-12-01','yyyy-mm-dd') FROM dual
    SELECT SYSDATE+10/24 FROM dual;
    
    -- MONTHS_BETWEEN(date1,date2),计算date1和date2之间的月数,他们两个之间的差可以为正也可以为负
    SELECT months_between(SYSDATE,to_date('1997-12-01','yyyy-mm-dd')) FROM dual;
    
    -- ADD_MONTHS(date,n),添加n个月到date,n必须是整数(可以是负数)
    SELECT add_months(SYSDATE,3) FROM dual;
    SELECT add_months(SYSDATE,-4) FROM dual;
    
    -- NEXT_DAY(date,'char'),计算在date之后的下一个周('char')的指定天的日期,char的值可能是一个表示一天的数或者是一个字符串
    SELECT next_day(SYSDATE,1) FROM dual;
    SELECT next_day(SYSDATE,'FRIDAY') FROM dual;
    -- 注:在oracle当中对星期的表示中,星期天是一个星期的第一天即为1,以此类推星期六是7
    
    -- LAST_DAY(date),计算包含date的月的最后一天的日期
    SELECT last_day(SYSDATE) FROM dual;
    
    
    -- ROUND(date,['format']),返回格式化模式format四舍五入到指定单位的date,如果format忽略,那么四舍五入到最近的天
    SELECT SYSDATE 当时日期,
    round(SYSDATE) 最近零点日期,
    round(SYSDATE,'day') 最近的星期日,
    round(SYSDATE,'month') 最近的月初第一天,
    round(SYSDATE,'q') 最近季度的第一天, 
    round(SYSDATE,'year') 最近年初日期 from dual;
    
    -- TRUNC(date,['format']),返回格式化模式format截断到指定单位的带天的时间部分的date,如果format忽略,date被截断到最近的天
    select sysdate 当时日期,
    trunc(sysdate) 今天日期,
    trunc(sysdate,'day') 本周星期日,
    trunc(sysdate,'month') 本月初,
    trunc(sysdate,'q') 本季初日期,
    trunc(sysdate,'year') 本年初日期 from dual;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    转换函数

    转换函数在PL/SQL的程序设计当中使用非常频繁的一个功能:

    • 在一个需要日期类型的代码块中,如果传入了一个字符串日期值,就需要使用oracle提供的转换功能将一种类型转换为另外一种类型;
    • oracle服务器对一些相容的类型,会自动进行隐式转换,对于一些无法相容的类型,则需要使用转换函数进行显式的转换:
      • ASCII(),将一个char类型的字符转换为对应的ASCII值
      • CHR(),和ASCII函数相反,将一个ASCII值转换为对应的char类型的值
      • TO_CHAR(),将日期或者数字类型的值转换为varchar2类型的值
      • TO_DATE(),将char或varchar2类型的字符串强制转换为日期值
      • TO_NUMBER(),将char或varchar2类型强制转换为number值

    转换函数的示例如下:

    -- 字符型 向 日期型转换
    SELECT * FROM scott.emp WHERE hiredate<'01-JAN-82';
    SELECT * FROM V$NLS_PARAMETERS WHERE parameter='NLS_DATE_FORMAT';
      
    -- 字符型 向 数字型转换
    SELECT * FROM scott.emp WHERE sal<'2000';
    
    -- ASCII(),将一个char类型的字符转换为对应的ASCII值
    SELECT ASCII('a') FROM dual;
    SELECT ASCII('b') FROM dual;
    
    -- CHR(),和ASCII函数相反,将一个ASCII值转换为对应的char类型的值
    SELECT CHR(97) FROM dual;
    SELECT * FROM scott.emp WHERE 'a'>'b';
    SELECT * FROM scott.emp WHERE 'b'>'a';
    
    -- TO_CHAR(),将日期或者数字类型的值转换为varchar2类型的值
      -- 将日期型转换为字符串
      SELECT to_char(SYSDATE,'cc q yyyy-mm-dd hh:mi:ss am') FROM dual;
      -- 将数字型转换为字符串
      SELECT to_char(sal,'$009,999') FROM scott.emp;
    
    -- 9 每一个9表示一个有效位,转换至的有效位应该和9的各位相同
    -- 0 显示前导的0或后继的0
    -- , 在指定的位置上返回一个逗号
    -- . 在指定的位置上返回一个小数点
    -- $ 返回带有前导货币符号的数值
    -- L 在指定的位置上返回本地的货币符号
    SELECT to_char(sal,'L999,999','NLS_CURRENCY=¥') FROM scott.emp;
    SELECT * FROM v$nls_parameters WHERE parameter='NLS_CURRENCY';
    
    -- TO_DATE(),将char或varchar2类型的字符串强制转换为日期值
    SELECT SYSDATE-to_date('1997-07-07','yyyy-mm-dd') FROM dual;
    
    -- TO_NUMBER(),将char或varchar2类型强制转换为number值
    SELECT * FROM scott.emp WHERE empno=to_number('7788');
    SELECT to_number('$1234,5678','$9999,9999') FROM dual;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    京东一小伙一年输出20篇专利,其实你也可以
    32、Java高级特性——日期操作类、Date类、SimpleDateFormat类、Calendar类
    基于Java+SpringBoot+Vue摄影分享网站的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】
    什么是数据资产?数据资产管理应该如何落地?
    深度学习从入门到精通—Transformer
    vue3响应式原理 vue3使用router vuex4 pinia的使用与传值 storeToRefs的使用
    [附源码]Python计算机毕业设计Django四川景区管理系统
    记录一次较为完整的Jenkins发布流程
    pdf文件如何转换成word文档呢?
    电源硬件设计----电源基础知识(2)
  • 原文地址:https://blog.csdn.net/qq_42554780/article/details/127346512