zoukankan      html  css  js  c++  java
  • Oracle数据库3--常用函数

    1.函数概念

    函数一般是在数据上执行的,它给数据的转换和处理提供了方便。只是将取出的数据进行处理,不会改变数据库中的值。

    函数根据处理的数据分为单行函数和聚合函数(组函数)。

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

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

    2.字符相关函数

    -- dual用于测试
    select * from dual;
    
    -- 1.字符串连接
    select concat('aa','12') from dual;
    select 'aa'||'12' from dual;
    
    -- 2.首字母大写
    select initcap('abc') from dual;
    --- 把大写转化小写
    select lower('ABc') from dual;
    select upper('abc') from dual;
    
    -- 把所有员工的姓名小写输出
    select lower(e.ename),e.empno
    from emp e
    
    -- 3.填充字符lpad/rpad
    select lpad('sxt',5,'*') from dual;
    select rpad('sxt',5,'*') from dual;
    
    -- 4.去掉空白字符
    select '  kallen' from dual;
    select ltrim('  kallen',' ') from dual;
    select rtrim('  kallen  ',' ') from dual;
    -- trim 删除左右两边的字符
    select trim('a' from 'abc') from dual;
    
    -- 5.求子串 substr(str,loc,len)-->loc从1开始
    select substr('abcd',2,2) from dual;
    
    -- 6.查找字符串
    /*
    如果找到返回>=1的索引;如果没找到返回0
    */
    select instr('abcd','b') from dual;
    
    -- 7.求长度
    select length('abcd') from dual;

    3.数值型函数

    -- 数值型函数
    -- 四舍五入round(x,y)对x保留y为小数
    select round(23.652) from dual;
    select round(23.652,1) from dual;
    select round(25.652,-1) from dual;
    
    -- 返回x按精度y截取后的值
    select trunc(23.652) from dual;
    select trunc(23.652,2) from dual;
    select trunc(23.652,-1) from dual;
    
    -- mod(x,y)求余数
    select mod(9,2) from dual;
    
    -- ceil 向上取整
    select ceil(1.9) from dual;
    -- floor 向下取整
    select floor(1.9) from dual;

    4.日期时间函数

    4.1  日期函数

    -- 返回系统当前时间
    select sysdate from dual;
    -- 返回当前会话时区中的当前日期 
    select current_date from dual;
    
    -- 添加月数
    select add_months(sysdate,1) from dual;
    -- 返回两个时间相差的月数
    select months_between(sysdate,add_months(sysdate,2)) from dual;
    
    -- 需求:查询工作年限在30年以上
    select e.ename,e.hiredate
    from emp e
    where months_between(sysdate,e.hiredate)/12 > 30
    
    -- 返回date所在月份最后的一天
    select last_day(add_months(sysdate,1)) from dual;
    -- next_day(date1,week) 返回date1下周星期几的日期
    select sysdate "当时日期",next_day(sysdate,'Monday') "下周星期一" from dual;
    
    -- 查询会话的环境参数
    select * from nls_session_parameters;

    4.2日期计算函数

    两个时间进行四则运算的单位是天。

    select sysdate+2 from dual;
    select sysdate-2 from dual;

    5.转换函数

    转换函数就是把字符、日期、数值型数据进行相互转换。类型转换分两种:隐式类型转换和显式类型转换。

    5.1隐式类型转换

    -- 字符隐式转换成数值
    select '100' - 10 from dual;
    
    -- 字符隐式转化为日期
    -- DD-MON-RR 默认的日期格式
    select 1 from dual
    where sysdate > '13-May-19';
    
    -- 查date format格式
    select * from nls_session_parameters;

    5.2显示类型转换

    5.2.1 to_char

    把日期转化成字符

    把数值格式化成字符串

    -- to_char
    -- 【1】把日期转化成字符
    -- 按照默认格式DD-MON-RR
    select to_char(sysdate) from dual;
    -- 按指定格式
    select to_char(sysdate,'YYYY"年"MM"月"DD"日" HH24:MI:SS') as t from dual;
    
    -- 【2】把数值格式化成字符串
    select to_char(12345,'99999.99') from dual;
    select to_char(12345,'99,999.99') from dual;
    select to_char(12345,'999,999.99') from dual;
    -- 不够位置0
    select to_char(12345,'000,000.00') from dual;
    -- 格式化成美元显示
    select to_char(12345,'$000,000.00') from dual;

    5.2.2 to_number、to_date

    -- to_number
    select to_number('$12,345','$99,999') from dual;
    select to_number('$12,345.12','$99,999.99') from dual;
    
    -- to_date
    select to_date('14-May-19','DD-MON-RR') from dual;
    select to_date('2004-09-19','YYYY-MM-DD') from dual;
    -- 查询雇用期满6个月的下一个周一的日期。
    select e.ename,e.hiredate,next_day(add_months(e.hiredate,6),'Monday')
    from emp e
    where months_between(sysdate,e.hiredate) > 6
    
    -- 查询公司boss
    select e.ename || nvl(to_char(e.mgr),' is boss')
    from emp e
    where e.mgr is null

    5.2.3 decode/case when

    decode(条件,值1,“返回值1”, 值2,“返回值2”,,,“默认值”)

    -- 需求:查询员工所在的部门名称
    select 
    e.ename,
    e.deptno,
    decode(e.deptno,10,'部门1',20,'部门2',30,'部门3','未知')
    from emp e;
     

    case when:

    -- case when
    select 
    e.ename,
    e.deptno,
    case e.deptno
      when 10 then '部门1'
      when 20 then '部门2'
      when 30 then '部门3'
      else '未知'
    end
    from emp e;
    -- 需求:对各个部门进行涨薪,10->1.1 20->1.2 30->1.3 其他->1.0
    select 
    e.deptno,
    e.ename,
    e.sal "涨薪前",
    decode(e.deptno,10,e.sal*1.1,20,e.sal*1.2,30,e.sal*1.3,e.sal) "涨薪后"
    from emp e
    
    -- 需求:根据工资分布输出以下信息
    /*
     <1000 真屌丝
     (1001,2000] 屌丝
     (2001,3000] 白领 
     (3001,5000] 高富帅
     (5001,10000] 土豪
    */
    
    select 
    e.ename "姓名",
    e.sal "工资",
    case
      when e.sal <= 1000 then '真屌丝'
      when e.sal <= 2000 then '屌丝'
      when e.sal <= 3000 then '白领'
      when e.sal <= 5000 then '高富帅'
      when e.sal <= 10000 then '土豪'
    else '未知'
    end "描述"
    from emp e;

    总结:decode 多用于等值匹配;case when可以用于等值,多用于条件分支。

    6.组函数

    组函数把多行数据经过运算后返回单个值。也称聚合函数。

    -- 求公司雇员的数量
    select count(*)
    from emp e;
    
    select count(e.empno) 
    from emp e;
    
    select count(1)
    from emp e;
    
    -- avg:对多个记录的某个字段求平均值
    -- 需求:求底薪的平均值
    select avg(e.sal)
    from emp e;
    
    
    -- 需求:求雇员的最高薪资/最低薪资
    select max(e.sal),min(e.sal),avg(e.sal)
    from emp e;
    
    -- 需求:求公司一个月的员工基本开销
    select sum(e.sal)
    from emp e;

    注意:

    [1] 组函数或聚合函数是对一个数据集(表数据、查询出来的表、分组的表)进行聚合。

    [2] 聚合函数对字段是null的值进行忽略。count(*) 

    -- 求有津贴的员工的数量
    select count(e.comm)
    from emp e;

    [3] max/min 适合任意数据类型,sum/avg 只适用于数值类型。

    聚合函数的结果可以作为其他查询条件。

    -- 最早入职的员工
    select e.ename,e.hiredate
    from emp e
    where e.hiredate = (select min(e.hiredate) from emp e);
  • 相关阅读:
    企业站前端——总结
    visual studio插件 visual assistx
    github 预览html
    Resharper
    c#解析json
    Visual Studio 2015 RC Downloads
    C#位运算讲解与示例
    java 位运算权限管控(转载)
    双机热备
    c# 代码执行时间
  • 原文地址:https://www.cnblogs.com/WhiperHong/p/10864757.html
Copyright © 2011-2022 走看看