04.oracle函数

04.oracle函数

概念

输入 -> (函数) -> 输出结果

sql的函数一般是在数据上执行,处理数据,不会改变数据库中的值;

分类

组函数: 聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句

单行函数: 单个数值进行操作,并返回一个值

单行函数
  • 字符函数

    • 返回字符类型

    • 返回数字类型

      --字符函数
      --concat:表示字符串的连接  等同于||
      select concat('my name is ',ENAME)
      from EMP;
      --将字符串的首字母大写
      select initcap(ENAME)
      from EMP;
      --将字符串全部转换为大写
      select upper(ENAME)
      from EMP;
      --将字符串全部转换为小写
      select lower(ENAME)
      from EMP;
      --填充字符串 lpad rpad
      select lpad(ENAME,10,'*')
      from EMP;
      select rpad(ENAME,10,'*')
      from EMP;
      -- 去除空格 trim ltrim rtrim
      select trim(ENAME)
      from EMP;
      
      select ltrim(ENAME)
      from EMP;
      
      select rtrim(ENAME)
      from EMP;
      -- 查找指定字符串的位置 instr
      select instr('ACABBB','A')
      from dual;
      -- 查看字符串的长度 length
      select length(ENAME) from emp;
      -- 截取字符串 substr
      select substr(ENAME,0,2) from emp;
      -- 替换操作 replace
      select replace('abckassjfalfajlabc','abc','acdc') from dual;
      
  • 数字函数

    • 输入为number类型,返回为number类型

      -- 四舍五入 round
      select round(123.123,2) from dual;
      select round(123.128,2) from dual;
      select round(-123.128,2) from dual;
      -- 截断数据,按照位数去进行截取,但是不会进行四舍五入的操作 trunc
      select trunc(123.123,2) from dual;
      -- 取模操作 mod
      select mod(10,4)
      from dual;
      select mod(-10,4)
      from dual;
      -- 向上取整 ceil
      select ceil(12.12)
      from dual;
      -- 向下去整 floor
      select floor(12.12) from dual;
      -- 取绝对值 abs
      select abs(-100)
      from dual;
      -- 获取正负值 正为 1 负为 -1 sign
      select sign(100)
      from dual;
      -- power x的y次幂
      select power(2,3)
      from dual;
      
  • 日期函数

    -- 日期函数
    -- 返回当前的日期
    select sysdate
    from dual;
    select current_date
    from dual;
    --add_months,添加指定的月份
    select add_months(HIREDATE,2),HIREDATE
    from EMP;
    
    -- last_day 返回输入日期所在月份的最后一天
    select last_day(sysdate)
    from dual;
    --两个日期相间隔的月份
    select sysdate,HIREDATE,months_between(sysdate,HIREDATE)
    from emp;
    
    -- round: 返回四舍五入的第一天
    select sysdate 当时日期,
           round(sysdate) 最近0点日期,
           round(sysdate,'day') 最近星期日,
           round(sysdate,'month') 最近月初,
           round(sysdate,'q') 最近季初,
           round(sysdate,'year') 最近年初日期
    from dual;
    -- next_day 返回下周的星期几
    select next_day(sysdate,'星期日') from dual;
    
    -- extract 提取日期中的时间
    select
           extract(hour from timestamp '2001-2-16 2:36:40') 小时,
           extract(minute from timestamp '2001-2-16 2:36:40'),
           extract(second from timestamp '2001-2-16 2:36:40'),
           extract(day from timestamp '2001-2-16 2:36:40'),
           extract(month from timestamp '2001-2-16 2:36:40'),
           extract(year from timestamp '2001-2-16 2:36:40')from dual;
    -- 返回日期的时间戳
    select localtimestamp
    from dual;
    select current_date
    from dual;
    select current_timestamp
    from dual;
    -- 给指定的时间单位增加数值
    select
    trunc(sysdate) + (interval '1' second ), -- 加1秒
    trunc(sysdate) + (interval '1' minute ), -- 加1分
    trunc(sysdate) + (interval '1' hour ), -- 加1小时
    trunc(sysdate)+(INTERVAL '1' DAY),  --加1天(1)
    trunc(sysdate)+(INTERVAL '1' month ),  --加1个月
    trunc(sysdate)+(INTERVAL '1' year ),  --加1 年
    trunc(sysdate)+(INTERVAL '01:02:03' hour to second ),  --指定小时到秒
    trunc(sysdate)+(INTERVAL '01:02' minute to second ),  --加指定分钟到秒
    trunc(sysdate)+(INTERVAL '01:02' hour to minute ),  -- 加指小时到分钟
    trunc(sysdate)+(INTERVAL '2 01:02' day to minute )  -- 加指小时到分钟
    from dual;
    
  • 转换函数

    • 隐式转换

      select '999' + 10 from dual;
      
    • 显式转换

      -- date : to_char
      select to_char(sysdate,'yyyy-MI-SS HH24:MI:SS')
      from dual;
      -- number : to_char
      select to_char(123.456,'99999999') from DUAL;
      select to_char(123.456789,'0000.00') from DUAL;
      select to_char(123.456789,'$0000.00') from DUAL;
      select to_char(123.456789,'L0000.00') from DUAL;
      select to_char(123456789,'999,999,999') from DUAL;
      -- to_date: 转换之后都是固定的格式
      select to_date('2020/12/29 10:10:10','YYYY-MM-DD HH:MI:SS') from dual;
      -- to_number: 转换为数字
      select to_number('123,456,789','999,999,999')
      from dual;
      
      -- 显示没有上级管理的公司首脑
      select ENAME,nvl(to_char(MGR),'boss')
      from EMP where MGR is null;
      -- 显示员工雇佣期满6个月后下一个星期五
      select HIREDATE,next_day(add_months(HIREDATE,6),'星期五')
      from emp;
      
  • 其他函数

    • 条件函数

      -- 条件函数
      -- decode, case when
      
      -- 给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30%
      select ENAME,sal,DEPTNO,
             decode(DEPTNO,10,SAL*1.1,20,SAL*1.2,30,SAL*1.3) 涨薪
      from EMP;
      
      -- 给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30% - case when
      select ENAME,sal,DEPTNO,
             case DEPTNO
                 when 10 then SAL*1.1
                 when 20 then SAL*1.2
                 when 30 then SAL*1.3
                 end 涨薪
      from EMP;
      
    • 组合函数

      /*
      组函数,一般情况下,组函数都要和groupby组合使用
      组函数一般用于选择列表或者having条件判断
      常用的组函数有5个
      avg()  平均值,只用于数值类型的数据
      min()  最小值,适用于任何类型
      max()  最大值,适用于任何类型
      count() 记录数,处理的时候会跳过空值而处理非空值
          count一般用来获取表中的记录条数,获取条数的时候可以使用*或者某一个具体的列
             甚至可以使用纯数字来代替,但是从运行效率的角度考虑,建议使用数字或者某一个具体的列
             而不要使用*
      
      sum()   求和,只适合数值类型的数据
      */
      
      
      select avg(SAL)
      from EMP;
      
      select min(SAL)
      from EMP;
      
      select max(SAL)
      from EMP;
      
      select count(SAL)
      from EMP;
      
      select sum(SAL)
      from emp;
      /*
          group by,按照某些相同的值去进行分组操作
          group进行分组操作的时候,可以指定一个列或者多个列,但是当使用了group by 之后,
          选择列表中只能包含组函数的值或者group by 的普通字段
      */
      -- 求每个部门的平均薪水
      select round(avg(SAL),2)
      from EMP group by DEPTNO;
      -- 求平均薪水大鱼2000的部门
      select round(avg(SAL),2),DEPTNO
      from EMP group by DEPTNO having avg(SAL) >2000 order by avg(SAL) desc;
      
      select count(100000)
      from EMP;
      -- 部门下雇员的工资>2000 人数
      select count(1)
      from EMP
      where SAL > 2000 ;
      
      -- 每个部门薪水最高
      select DEPTNO,max(SAL)
      from EMP group by DEPTNO;
      
      -- 部门里面 工龄最小和最大的人找出来  使用了group by 之后,
      --     选择列表中只能包含组函数的值或者group by 的普通字段
      select DEPTNO,min(HIREDATE),max(HIREDATE)
      from EMP group by DEPTNO;
      
      select ENAME,DEPTNO
      from EMP where
                     HIREDATE in (select min(HIREDATE) from EMP group by DEPTNO)
              or HIREDATE in (select max(HIREDATE) from EMP group by DEPTNO);
      
      select mm2.DEPTNO,e1.ENAME,e1.HIREDATE
      from EMP e1,
           (select min(e.HIREDATE) mind,
                   max(e.HIREDATE) maxd,
                   e.DEPTNO
           from EMP e group by DEPTNO) mm2
      where (e1.HIREDATE = mm2.mind or e1.HIREDATE = mm2.maxd) and e1.DEPTNO = mm2.DEPTNO;
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值