zoukankan      html  css  js  c++  java
  • 单行函数

    问题:查询当前数据库系统时间(sysdate)
    select sysdate
    from dual;

    dual :是Oracle自带的一张虚拟表,没有任何意义,为了保证sql语句的完整性。

    Oracle中携带了大量了函数:
    单行函数(single function)
    多行函数(组函数)

    --------------数字函数-------------------------------------
    round(列|值|表达式,小数的有效位数) 表示四舍五入

    select round(3.1415926,3)from dual;
    -------------
    3.142

    trunc(列|值|表达式,小数的有效位数) 直接截取

    select trunc(3.1415926,3)from dual;
    --------------
    3.141

    案例:
    --将值2784.342933精确到小数点后3位,四舍五入
    select
    round(2784.342933,3)
    from
    dual;

    --将值2784.342933精确到小数点后3位,不四舍五入
    select trunc(2784.342933,3) from dual;
    --将值2784.642933精确到整数,2784
    select trunc(2784.342933,0) from dual;
    --将值2784.342933精确到整数十位,2780
    select trunc(2784.342933,-1) from dual;
    --将值2784.342933精确到整数百位,2800
    select round(2784.342933,-2) from dual;


    mod(列|值,列|值) 求余数
    --求5/2的余数
    select mod(5,2) from dual;


    abs(列|值) 求绝对值
    --求-2的绝对值
    select abs(-2) from dual;


    --查询订单表s_ord中总金额total(取整)
    select trunc(total,0) from s_ord;(不四舍五入)
    select round(total,0) from s_ord;(四舍五入)

    -------------字符函数-------------------------------------
    length(列|值|表达式);求长度
    --获取员工表中员工名字及其名字长度
    select
    first_name,length(first_name)
    from
    s_emp
    ;

    --查看HelloWorld字符串的长度
    select length(HelloWorld) from dual;

    --查询出员工姓名长度为6的员工信息
    select * from s_emp where length(first_name)=6;

    >>
    upper(列|值|表达式);全部转大写字母
    lower(列|值|表达式);全部转小写字母
    initcap(列|值|表达式);每个单词首字母大写

    select upper('abc')from dual;==>ABC
    select lower('ABC')from dual;==>abc
    select initcap('hello world')from daul;==>Hello World

    例子:查询ben的工资
    select salary from s_emp where lower(first_name) = lower('ben');


    >>
    lpad(列|值,宽度,填充字符);从左边补不足宽度个填充字符
    rpad(列|值,宽度,填充字符);从右边补不足宽度个填充字符

    select rpad('abc',10,'de')from dual;
    ------------------
    abcdededed

    select lpad('abc',10,'de')from dual;
    ----------------
    dedededabc





    >>
    ltrim(列|值,截取字符);从左边截取字符
    rtrim(列|值,截取字符);从右边截取字符

    select rtrim('abcdedede','de') from dual;
    ------------
    abc
    select rtrim('abcddedede','de') from dual;
    --------------
    abc --表示从右边开始截取de|d|e,直到不同于截取字符的字符为止




    >>
    replace(列|值,被置换的字符,置换的字符);置换指定字符

    select replace('helloworld','owo','***')from dual;==》hell***rld

    select replace(111222333,222,666)from dual;==>111666333


    >>
    translate(参数一,参数二,参数三);转换指定字符
    参数一:要处理的内容,列|值
    参数二:要检索的内容
    参数三:检索后,与检索内容一一对应替换的内容(如果无替换值,则全部去掉)

    select
    translate('He1l20l4o W65o75rl4d765!',
    'abcdefghijklmnopqrstuvwxyz0123456789',
    'abcdefghijklmnopqrstuvwxyz')
    from dual;

    >>
    instr(要查询的字符串,希望查询的字符串,从什么位置开始,第几次出现)查找指定字符串中所在的位置下标
    select instr('go,go,come on!','go',1,2)from dual;

    注意:数据库字符串下标从1开始计数。

    >>
    substr(列|值,指定位置下标,保留几位)
    select substr('hello world!',3)from dual;表示:从指定下标处开始获取字符。

    select length(substr('hello world!',3,4))from daul;表示:从3号坐标开始获取,保留四个长度

    练习:
    --4、找出名字长度超过5的员工
    select * from s_emp where length(first_name)>5;

    --5、找出职位是stock clerk的员工
    select * from s_emp where lower(title) = lower('stock clerk');

    --1、把图片表(s_image)中文件名(filename)列中后缀查出来
    select
    distinct substr(filename,instr(filename,'.',-1,1))
    from
    s_image;
    --2、查出客户表(s_customer)中phone列最后一个-线后面部分
    select
    substr(phone,instr(phone,'-',-1,1)+1)
    from
    s_customer
    ;


    例:奥巴马-->奥**
    select replace('奥巴马','巴马','**') from dual;


    --3、在员工表中模拟显示加密姓名(如:奥巴马-->奥**)
    方法一:rpad
    select rpad(substr(first_name,1,1),length(first_name),'*') from s_emp;

    方法二:replace
    select
    first_name,
    replace(first_name,substr(first_name,2),rpad('*',length(first_name)-1,'*'))
    from
    s_emp;

    >>
    decode()
    a.类似一个三目运算符:(表达式?a:b)如果表达式为true,取a;如果表达式为false,取b
    比较第一和第二个参数,如果相等取第三个参数,如果不相等取第四个参数。

    select decode('A','A','B','C')from dual;
    select decode(1,1,2,3)from dual;
    select decode(1,2,2,3)from dual;


    b.if else if else
    decode(A,b,c,d,e,f,g,h,i,j)
    如果A=b,输出c;
    如果A=d,输出e;
    如果A=f,输出g;
    如果b,d,f都不满足A,输出h.

    --输出显示每个订单编号及支付方式,支付方式要么是现金,要么是信用卡,否则就是未知数。
    select id,decode(payment_type,'CASH','现金','CREDIT','信用卡','未知数' )
    from s_ord;


    --输出区域表(s_region)中,每个地区对应的中文


    >>
    case when 可以把它看成switch功能;


    select name 部门名,
    case region_id
    when 1 then '北美'
    when 2 then '南美'
    when 3 then '中东'
    when 4 then '亚洲'
    when 5 then '欧洲'
    else '未知区域'
    end "区域名"
    from s_dept;


    --请把员工工资分为3等,超过2000元的为高等,在1500到2000之间的为中等,低于1500的为低等
    select
    first_name,
    case
    when salary<1500 then'低等'
    when salary>=1500and salary<=2000 then'中等'
    when salary>2000 then'高等'
    end
    from
    s_emp;

    注意:case后面是否出现列名,取决于when后面条件是否出现比较列
    如果when后面已经出现列名,那case后面务必不能写列名,
    如果when后面是值,那么必须在case后面指定列名,否则无法确定所给的值的真正含义


    -------日期函数-------------------------------------------------------
    oracle默认的日期格式为 dd-MON-yy
    select sysdate from daul;

    dd 表示2位数的日
    mon/month 表示月份,如:6月
    mm 表示2位数的月,如:06
    yyyy 表示4位数的年份
    HH24 表示24小时
    HH 表示12小时
    mi 表示分钟
    ss 表示秒
    fm 表示去掉前面的0,如:fm 06,值为6
    day 表示星期几

    日期函数:
    sysdate 当前日期
    months_between(date1,date2) 2个日期之间的月数
    --查询2014年11月1日和2016年12月9日之间的间隔月数
    select trunc(abs(months_between(to_date('2014-11-1','yyyy-mm-dd'),to_date('2016-12-9','yyyy-mm-dd'))),0) from dual;

    add_months(date1,n) 在date1的基础上加n个月
    --半年后的日期是什么?
    select add_months(sysdate,6) from dual;
    --半年前的日期是什么?
    select add_months(sysdate,-6) from dual;


    next_day(date1,'星期几') 在date1的基础上,下星期几是什么时候
    --下一个星期五是几号?
    select next_day(next_day(sysdate,'星期五')) from dual;

    last_day(date1) date1日期所在月的最后一天是什么时候
    --查询当月底是几号
    select last_day(sysdate) from dual;

    --查询下月底是几号
    select last_day(add_months(sysdate,1)) from dual;


    练习:
    --查询所有员工的工作月数
    select trunc(months_between(sysdate,start_date),0) from s_emp;

    --查询所有员工的工作天数
    select first_name,round((sysdate-start_date),0) from s_emp;
    注意:Oracle中日期类型是可以减法运算的,结果是两个日期的天数!!!

    --计算一年前,当前,一年后的时间
    select add_months(sysdate,-12),sysdate,add_months(sysdate,12) from dual;

    --当前日期的前六个月的最后一天
    select last_day(add_months(sysdate,-6)) from dual;

    --显示下个星期五是什么日期
    select next_day(next_day(sysdate,'星期五')) from dual;


    补充:
    修改当前会话语言环境:
    alter session set nls_language = 'american';//改为英文
    alter session set nls_language = 'simplified chinese';//改为简体中文

    修改当前会话日期格式:
    alter session set nls_date_formate='yyyy-mm-dd HH24:mi:ss';//改为年月日时分秒

    -----转换函数--------------------------------
    to_number:字符转换成数字
    select to_number('9837492.563','999999999.999') from dual

    to_date:字符转换成日期
    select to_date('2009-10-3 15:10:23','yyyy-mm-dd hh24:mi:ss') from dual
    to_char:日期/数字 转换成 字符
    select to_char (sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
    select to_char(9837492,'$999,999,999.99') from dual
    select to_char(9837492.563,'999999999.99') from dual


    --把123字符串转换成数字123
    --把2000-02-22字符串按照模板yyyy-mm-dd转换成日期
    --把数字格式化为字符窜的时候可以用一些符号
    9 代表任意数据
    L 代表本地的货币符号
    $ 代表美元
    0 代表0

  • 相关阅读:
    Codeforces Round #548
    省选前的th题
    省选前多项式的挣扎
    2019.3.18考试&2019.3.19考试&2019.3.21考试
    省选前的反演抢救计划
    2019.3.16 noiac的原题模拟赛
    AtCoder Regular Contest 069 F
    Atcoder Grand 012 C
    Atcoder Grand 011 C
    Atcoder Grand 006 C-Rabbit Exercise
  • 原文地址:https://www.cnblogs.com/zhang12354/p/7827771.html
Copyright © 2011-2022 走看看