第四章单行函数课堂笔记和练习

这篇博客详细介绍了Oracle数据库中的单行函数,包括字符函数如lower()、upper()和substr(),数值函数如round()和mod(),以及日期处理函数如sysdate和add_months()。还探讨了转换函数如to_char()、to_date()和to_number()的使用,强调了数据格式匹配的重要性。此外,文章提到了通用函数如nvl()和case表达式的应用,以及函数的嵌套使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

– 字符函数

  • 大小写转换函数:lower() upper() initcap()

    --  lower() 将所有字母转小写
        select lower(ename) from emp;
        select ename from emp where lower(ename) like '%s%';
    
    --  虚表 dual(可以拿来显示一些表中不存在的数据,一般用于测试用表)
        select lower('KJLAF') from dual;
    
    
    --  upper() 将所有字母转大写
        select upper('lkajf') from dual;
    
    
    --  initcap() 将每个单词首字母大写
        select initcap('hello world') from dual;
    
  • 字符处理函数:count() substr() length() instr() lpad() rpad() trim() replace()

      --  concat(参数一,参数二) 拼接函数
      --  注意:concat拼接函数只能拼接两层,还要加拼接字符的话需要再嵌套一层concat函数
          select concat(concat(ename,'的职位是'), job) from emp;
    
      --  substr(参数一,n1,[n2]) 截取函数
          select substr('KJLAF', 2) from dual;
          --  返回第一个参数中,从第n1位开始,长度为n2的子串。
          --  如果n2省略,取第n1位开始的所有字符。
          --  如果n1是负值,表示从第一个参数的后面第abs(n1)位开始向右取长度为n2的子串。
    
      --  length(参数) 获取字符串的长度
      --  注意:length函数取中文时长度是字数的两倍!!!
          select length('KJLAF') from dual;
    
      --  instr(s1,s2,[n1],[n2]) 获取指定字符的索引
          --参数一:待获取索引位置的字符  
          --参数二:需获取索引位置的字符   
          --参数三:开始查找的位置  
          --参数四:指定字符第N次出现的位置
          --  返回s1中,子串s2从n1开始,第n2次出现的位置。n1,n2默认值为1
          select instr('KJLAF','J') from dual;
          select * from emp where 0 < instr(ename, 'A');
    
      --  lpad(参数一,参数二,参数三) 左填充
         -- 参数一:要被填充的字符或表达式、列名
         -- 参数二:定义填充的字符总长度
         -- 参数三:定义在左边填充的字符
          select lpad(lpad(empno,10,0),11,'C') from emp;
          select concat('C',lpad(empno,10,0)) from emp;
          select 'C' || lpad(empno,10,0) from emp;
    
      -- rpad(参数一,参数二,参数三) 右填充(与上类似)
         select rpad(rpad(empno,10,0),11,'C') from emp;
         select concat(rpad(empno,10,0),'C') from emp;
         select rpad(empno,10,0) || 'C' from emp;
    
      --  trim() 去除首尾字符,默认去除空格
          select trim(leading 's' from 'sskjh dfs') from dual;
          select trim(trailing 's' from 'sskjh dfs') from dual;
          select trim(both 's' from 'sskjh dfs') from dual;
          select trim('s' from 'sskjh dfs') from dual;
    
      --  replace(s1,s2,s3) 把s1中的s2用s3代替
          select replace('beijing', 'bei', 'nan') from dual;
    
  • 数值函数:round() trunc() mod()

    --  round(参数,n) 四舍五入,取小数点后第n位
        select round(45.654, 1) from dual;--45.7 n>0
        select round(45.654, 0) from dual;--46 n=0
        select round(45.654, -1) from dual;--50 n<0
    
    
    --  trunc(参数,n) 截断,截取小数点后第n位
        select trunc(45.654, 1) from dual;--45.6 n>0
        select trunc(45.654, 0) from dual;--45 n=0
        select trunc(45.654, -1) from dual;--40   n<0
    
    
    --  mod(除数,被除数) 取余
        select mod(9, 2) from dual;
    
  • 日期处理

     Oracle是以一种内部的数值形式存储日期的,即:世纪、年、月、日、小时、分、秒 
    
     默认的日期形式是: DD-MON-RR
    

    这里写图片描述

  • 日期型函数:sysdate months_between() add_months() next_day() last_day() round() trunc() extract()

    --  sysdate 获取当前系统时间
        select sysdate from dual;                 
    
    
    --  1.查询每个员工截止到现在一共入职多少天?
        select (sysdate - hiredate) 入职天数
               from emp;
    
    
    --  months_between(减数日期,被减数日期) 返回两个年份之间相隔的月数
        select months_between(sysdate, hiredate) from emp;
        select months_between('31-12月-18','31-10月-18') from dual;
    
    
    --  add_months(日期,加的月数) 加月份
        select add_months(hiredate, 6) 转正日期 from emp;
    
    
    --  next_day(日期,'星期几') 返回指定日期的下一个指定日期
        select next_day(sysdate, '星期一') from dual;
    
    
    --  last_day(日期) 返回当前月份的最后一天
        select last_day(sysdate) from dual;
    
    
    --  round(日期,'参数')
    --  年份按1-6月和7-12月四舍五入到最近的 几几年1月
    --  月份按1-15日和16-30日四舍五入到最近的 几月1日
    --  天数按周一至周三 和 周四至周日四舍五入到最近的 周日
    
        select round(sysdate, 'month'), round(sysdate, 'day') from dual;
    --  以'day'作为参数,取以星期一到三,星期四到日四舍五入
    
    
    --  trunc(日期,'参数') 
    --  年份按1-6月和7-12月四截取到当年的1月1日
    --  月份按1-15日和16-30日截取到当月的1日
    --  天数按周一至周三 和 周四至周日四截取到上一个周日
    
        select trunc(sysdate, 'month'), trunc(sysdate, 'day') from dual;    
    
    
    --  extract(年、月、日 from 日期) 提取指定日期年月日
        select extract(year from sysdate) 年,
               extract(month from sysdate) 月,
               extract(day from sysdate) 日
          from dual;
    

    – 转换函数

    • 隐式数据转换

       select '1234'+100 from dual;
      
      1.对于INSERT和UPDATE操作,oracle会把插入值或者更新值隐式转换为字段的数据类型
      
      2.对于SELECT语句,oracle会把字段的数据类型隐式转换为变量的数据类型
      
      3.当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型
      
      4.当比较字符型和日期型的数据时,oracle会把字符型转换为日期型
      
      5.用连接操作符(||)时,oracle会把非字符类型的数据转换为字符类型
      
      6.如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算,
        则oracle会将字符类型的数据转换为合适的数据类型,
        这些数据类型可能是number、date、rowid等
      
    • 显示数据转换:to_char() to_date() to_number()

      – to_char 字符转换

      • 转日期

      这里写图片描述
      用时间元素格式化日期的时间部分

      • hh24:mi:ss am

        • hh表示时间,24表示24小时制,因此12则是12小时制;
        • mi表示分钟
        • ss表示秒
        • am用于显示当前时间是上午还是下午

          select to_char(sysdate) from dual;--  默认
          
           select to_char(sysdate, 'YYYY"年"MM"月"DD"日" HH24:MI:SS') 
             from dual;-- 2018年07月25日 11:06:02
          
           select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') 
             from dual;-- 2018-07-25 11:07:26
          
           select to_char(sysdate, 'YYYY/MM/DD HH24:MI:SS') 
             from dual;-- 2018/07/25 11:07:39
          
        • 转数值
          注意:进行数字类型到字符型转换时,格式中的宽度一定要超过实际列宽度,否则会显示为###
          这里写图片描述

          select to_char(30000.45, ‘L99,999.9’) from dual;– ¥30,000.5,四舍五入

        – to_number 数值转换
        注意:要转换的char类型数据必须是由数字组成的字符串,格式码中相应的格式必须要和char中的格式匹配

         select to_number('1234')+100 from dual;
        

        – to_date 日期转换
        注意:要转换的char类型数据必须是可以转换成日期的字符,格式码的格式必须要和char中的格式匹配

         select to_date('2018年7月25日', 'yyyy"年"mm"月"dd"日"') from dual; 
        

– 通用函数:nvl() nvl2() nullif() coalesce() case decode

  • 与空值(NULL)相关的

     --  nvl(参数一,参数二) 参数一为空,返回参数二,否则返回参数一
       select nvl(comm,0) from emp;
    
    --  nvl2(参数一,参数二,参数三) 参数一为空,返回参数三,否则返回参数二
        select nvl2(comm, comm, 0) from emp;
    
    --  nullif(参数一,参数二) 参数一等于参数二,返回NULL,否则返回参数一
        select nullif(10,23) from dual;
        select nullif(10,10) from dual;    
    
    --  coalesce(参数一,参数二,... ,参数n) 返回第一个不为空的参数
        select coalesce(null,null,3) from dual;
    
  • 条件处理函数(case, decode)

    --  case
    --  case语法:
        CASE expr 
         WHEN comparison_expr1  THEN return_expr1
         [WHEN comparison_expr2 THEN return_expr2
         WHEN comparison_exprn  THEN return_exprn
         ELSE else_expr]
        END
        !!注意:case的判断条件可以写在case后面统一做判断名,也可放在when 后面逐一判断
    eg:
        select deptno,
               case 
                 when deptno=10 then
                  '部门一'
                 when deptno=20 then
                  '部门二'
                 else '部门三'
               end
          from emp;
    
    
    --  decode
    --  decode语法:
        DECODE(字段|表达式, 条件1,结果1[,条件2,结果2…,][,缺省值])
    
    eg:
        select deptno,
               decode(deptno,  10,  '部门一', 20, '部门二')
          from emp;
    

–函数嵌套(单行函数可以嵌套任意多层)
嵌套的函数是从最里层向最外层的顺序计算的

这里写图片描述

select ename, concat(ename,nvl(to_char(mgr), 'No Manager')) 
  from emp where mgr is null;--KING
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值