• 单行函数


    SQL中不同类型的函数

    在select语句中使用字符,数字,日期和转换函数

    使用条件表达式

    单行函数:字符  通用   转换  日期   数值

    --字符:

    -- 控制大小写   lower   upper   initcap

    SELECT lower( 'AFANGFANG'),upper('AFANGFANGmiaomiao') ,initcap('AFANGFANG MIAOMIAO') FROM dual;

    LOWER('AFANGFANG') UPPER('AFANGFANGMIAOMIAO') INITCAP('AFANGFANGMIAOMIAO')
    ------------------ -------------------------- ----------------------------
    afangfang          AFANGFANGMIAOMIAO          Afangfang Miaomiao          

    --应用

     select  last_name from employees where upper(last_name) = 'KING';

    LAST_NAME              
    -------------------------
    King                     
    King                     

    --  字符控制函数

    函数 结果
    concat('Hello','World') HelloWorld              拼接
    substr('HelloWorld',1,6) HelloW                   第一位开始  截6个字符
    length('HelloWorld') 10
    instr('HelloWorld','W') 6                          字符在字符串首次出现的位置            select instr('HelloWorld','l') from dual;   3
    lpad(salary,10,'*') *****24000           给10个位不足的用*填   填左边        select employee_id,last_name,lpad(salary,10,' ') from employees; 
    rpad(salary,10,'*') 24000*****
    trim('H' from 'HelloWorLdH') elloWorLd              去除首尾的                                  select  trim('H' from 'HelloWorLdH')  from dual;  
    replace('abcedd','d','m') abcemm                 全部替换                                    select replace('abcedd','d','m')  from dual;  

    --   数字函数

    --round 四舍五入

    select round(435.45,1),round(435.45),round(435.45,-1) from dual;

    ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
    --------------- ------------- ----------------
              435.5           435              440

    -- trunc 截断

    select trunc(435.45,1),round(435.45),round(435.45,-1)from dual;

    TRUNC(435.45,1) ROUND(435.45) ROUND(435.45,-1)
    --------------- ------------- ----------------
              435.4           435              440

    -- mod 求余

    select mod(1200,100)from dual;

    MOD(1200,100)
    -------------
                0

    select mod(1200,500)from dual;

    MOD(1200,500)
    -------------
              200

    -- 日期的数学运算:在日期上加上或者减去一个数字结果仍为日期

    --                              两个日期相减返回日期之间相差的天数(日期不允许做加法运算, 无意义)

    --                             可以用数字除去24来向日期中加上或减去的天数

    --查工作的天数

    select employee_id, last_name, trunc(sysdate-hire_date) worked_days from employees;

    EMPLOYEE_ID LAST_NAME                 WORKED_DAYS
    ----------- ------------------------- -----------
            100 King                            11966
            101 Kochhar                         11139
            102 De Haan                          9929
            103 Hunold                          11035

    --查工作月数

    select employee_id, last_name, (sysdate-hire_date)/30 worked_days1, months_between(sysdate,hire_date) worked_days2 from employees;

    -- 一般使用后面的(准确)select employee_id, last_name,months_between(sysdate,hire_date) worked_days2 from employees;

    EMPLOYEE_ID LAST_NAME                 WORKED_DAYS1 WORKED_DAYS2
    ----------- ------------------------- ------------ ------------
            100 King                       398.8906821   393.152273
            101 Kochhar                    371.3240154          366
            102 De Haan                    330.9906821  326.2813053
            103 Hunold                     367.8573488  362.6038859

    --来公司的员工,hire_date是每个月倒数第二天来公司的有哪些?

    select last_name ,hire_date from employees where hire_date = last_day(hire_date)-1;

    LAST_NAME                 HIRE_DATE
    ------------------------- ---------
    Atkinson                  30-OCT-97
    Tucker                    30-JAN-97
    Olsen                     30-MAR-98
    King                      30-JAN-96

    --  转换函数:数据类型转换 : 隐性 & 显性

    -- 隐式转换:

               select '12'+2 from dual;

        '12'+2
    ----------
            14

    -- 显示转换:

    date转换为char型的:where to_char(hire_date,'yyy"年"-mm"月"-dd"日"') = '1994年- 03月-09日'

    char转换为date型的:where to_date('1994-03-23','yyyy-mm-dd') =hire_date; 

    numberhe char之间的转换: 

    --前面不用0填的用99 ,用0 填的写成0,前面可以加$或者L(为本地的)

    --s数字转换为字符的   to_char

    select   to_char(12343253443.77,'999,999,999,999,999.99') from dual;

    TO_CHAR(12343253443.77,'999,999,999,999,999.99')
    ------------------------------------------------
          12,343,253,443.77   

    select to_char(12343253443.77,'000,000,000,000,000.00') from dual;

    TO_CHAR(12343253443.77,'000,000,000,000,000,00')
    ------------------------------------------------
     000,000,123,432,534,44   

    select to_char(12343253443.77,'L999,999,999,999,999.99') from dual;

    TO_CHAR(12343253443.77,'L999,999,999,999,999.99')
    -------------------------------------------------12,343,253,443.77  

    --字符转换为数字 to_number

    select to_number('¥12,343,253,443.77','L999,999,999,999,999.99')from dual;

    TO_NUMBER('¥12,343,253,443.77','L999,999,999,999,999.99');
    ---------------------------------------------------------
                                                  12343253440

    -- 通用函数:适用于任何数据类型,同时也适用于空值

    -- nvl(e1,e2)    当这e1不为空用它本身,为空用后面e2的值代替

    -- 求公司员工的年薪含commission_pct

    select employee_id ,last_name ,salary*12*(1+nvl(commission_pct,0)) "annual sal" from employees;

    EMPLOYEE_ID LAST_NAME                 annual sal
    ----------- ------------------------- ----------
            100 King                          288000 
            101 Kochhar                       204000 
            102 De Haan                       204000 
            103 Hunold                        108000 

    -- 输出 last_name , department_id ,当 department_id 为null 时,显示  '没有部门'

    select last_name,nvl(to_char(department_id),'没有部门') from employees;

    LAST_NAME                 NVL(TO_CHAR(DEPARTMENT_ID),'没有部门')     
    ------------------------- ----------------------------------------
    King                      90Taylor                    80                                       
    Grant                     没有部门                                 
    Urman                     100              

    --nvl2(e1,e2,e3)

    --nullif(e1,e2)

    --coalesce(e1,e,2,..,en)

    -- 条件表达式:sql语句中使用if-then-else逻辑

    使用的两种方法: case表达式

                                 decode函数

    -- 查询部门号为10,20,30 的员工信息,若部门号为10,则打印其工资的1.1倍,

    --20号部门,则打印其工资的1.2倍,30号部门打印其工资的1.3倍

    select employee_id,last_name,department_id ,case department_id when 10 then salary*1.1
                                                                    when 20 then salary*1.2
                                                                    else  salary*1.3 end   new_sal
    from employees 
    where department_id in(10,20,30);
    select employee_id,last_name,department_id ,decode(department_id,10,salary*1.1,
                                                                      20,salary*1.2,
                                                                      30,salary*1.3) new_sal
    from employees 
    where department_id in(10,20,30);
    EMPLOYEE_ID LAST_NAME                 DEPARTMENT_ID    NEW_SAL
    ----------- ------------------------- ------------- ----------
            200 Wha_len                              10       4840 
            201 Hartstein                            20      15600 
            202 Fay                                  20       7200 
            114 Raphaely                             30      14300 
            115 Khoo                                 30       4030 
    

    练习:

    --  1. 打印出 "2009年10月14日 9:25:40" 格式的当前系统的日期和时间

    select to_char(sysdate,'yyyy"年"-mm"月"-dd"日" hh:mi;ss') from dual;

    TO_CHAR(SYSDATE,'YYYY"年"-MM"月"-DD"日"HH:MI;SS')
    ----------------------------------------------
    2020年-03月-22日 10:34;27     

    -- 2.将员工的姓名按首字母排序,并写出姓名的长度(length)

    select last_name,length(LAST_NAME) FROM employees order by last_name; 
    LAST_NAME                 LENGTH(LAST_NAME)
    ------------------------- -----------------
    Abel                                      4 
    Ande                                      4 
    Atkinson                                  8 
    Austin                                    6 

    -- 3. 查询各员工的姓名,并显示出各员工在公司工作的月份数 round保留一位小数

    select last_name,hire_date,round(months_between(sysdate,hire_date),1) workded_month from employees;
    LAST_NAME                 HIRE_DATE WORKDED_MONTH
    ------------------------- --------- -------------
    King                      17-6月 -87         393.2 
    Kochhar                   21-9月 -89           366 
    De Haan                   13-1月 -93         326.3 
    Hunold                    03-1月 -90         362.6 

    --  4.使用case函数,按照下面的条件:

    job                    grade

    AD_PRES            A

    ST_MAN              B

    IT_PROG             C

    SA_REP              D

    ST_CLERK          E

    产生下面的结果

    Last_name

    Job_id

    Grade

    king

    AD_PRES

    A

     

     

        select last_name "Last_name",job_id "Job_id",case job_id when 'AD_PRES'  then 'A'
                                                                 when 'ST_MAN'   then 'B'
                                                                 when 'IT_PROG'  then 'C'
                                                                 when 'SA_REP'   then 'D'
                                                                 when 'ST_CLERK' then 'E' end  "Grade"
        from employees;
    Last_name                 Job_id     Grade
    ------------------------- ---------- -----
    King                      AD_PRES    A     
    Kochhar                   AD_VP            
    De Haan                   AD_VP            
    Hunold                    IT_PROG    C     
    Ernst                     IT_PROG    C     
    Lorentz                   IT_PROG    C   
    All that work will definitely pay off
  • 相关阅读:
    我也受不了这扯蛋的IE6/7了
    子元素的margintop与父元素合并的问题
    在是否使用浮动上的纠结
    CSS中zoom:1是怎么回事
    java.util.ConcurrentModificationException异常解决方法
    【转】单例模式
    servlet中实现页面跳转的两种方法
    tomcat日志,用户以及启动时的一些问题
    【转】自定义 Java Annotation
    jsoup的使用
  • 原文地址:https://www.cnblogs.com/afangfang/p/12540709.html
Copyright © 2020-2023  润新知