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

    一、什么是函数

        任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称为函数。

    二、单行函数简介

        单行函数只对表中的一行数据进行操作,并且对每一行数据只产生一个输出结果。单行函数可以接受一个或多个参数,其产生的输出结果的数据类型可能与参数的数据类型不同。

        单行函数包含:

        1.字符型

        2.数字型

        3.日期型

        4.转换型

        5.一般型函数

    三、单行字符型函数

        常用的字符型函数包括:

        LOWER、UPPER、INITCAP、CONCAT、SUBSTR、LENGTH、INSTR、TRIM、REPLACE

        1.LOWER(列名|表达式):该函数是把字符转换成小写。

    SQL> select LOWER('SQL: Structural Query Language')
      2  from dual;
    
    LOWER('SQL:STRUCTURALQUERYLANG
    ------------------------------
    sql: structural query language

        2.UPPER(列名|表达式):该函数是把字符转换成大写。

    SQL> select upper ('sql is used exclusively in rdbmses')
      2  from dual;
    
    UPPER('SQLISUSEDEXCLUSIVELYINRDBMS
    ----------------------------------
    SQL IS USED EXCLUSIVELY IN RDBMSES

        3.INITCAP(列名|表达式):该函数是把每个字的头一个字符转换成大写,其余的转换成小写。

    SQL> select INITCAP('SQL is an ENGLISH LIKE language')
      2  from dual;
    
    INITCAP('SQLISANENGLISHLIKELANG
    -------------------------------
    Sql Is An English Like Language

        4.CONCAT(列名|表达式,列名|表达式):该函数是把头一个字符串和第二个字符串连接成一个字符串。

    SQL> select CONCAT('SQL allows you to manipulate the data in DB',
      2                ' without any programming knowlege')
      3  from dual;
    
    CONCAT('SQLALLOWSYOUTOMANIPULATETHEDATAINDB','WITHOUTANYPROGRAMMINGKNOWLEGE'
    ----------------------------------------------------------------------------
    SQL allows you to manipulate the data in DB without any programming knowlege

        5.SUBSTR(列名|表达式,m,[n]):该函数是返回指定的字符串。该字符串是从第m个字符开始,其长度为n。

    SQL> select SUBSTR('SQL lets you concentrate on what has to be done',14)
      2  from dual;
    
    SUBSTR('SQLLETSYOUCONCENTRATEONWHA
    ----------------------------------
    concentrate on what has to be done

        在这个例子中我们省略了n,其结果是返回从第14个字符开始一直到结尾的所有字符。
        6.LENGTH(列名|表达式):该函数是返回列中或表达式中字符串的长度。

    SQL> select LENGTH('SQL does not let you concentrate on how it will be achieved')
      2  from dual;
    
    LENGTH('SQLDOESNOTLETYOUCONCENTRATEONHOWITWILLBEACHIEVED')
    ----------------------------------------------------------
                                59

        7.INSTR(列名|表达式,'字符串',[m],[n]):该函数是返回所给字符串的数字位置,m表示从第m个字符开始搜索,n表示所给字符串出现的次数,它们的默认值都为1。

    SQL> select INSTR('SQL allows for dynamic DB changes','F')
      2  from dual;
    
    INSTR('SQLALLOWSFORDYNAMICDBCHANGES','F')
    -----------------------------------------
                        0
    
    SQL> select INSTR('SQL allows for dynamic DB changes','f')
      2  from dual;
    
    INSTR('SQLALLOWSFORDYNAMICDBCHANGES','F')
    -----------------------------------------
                           12

        8.TRIM([leading|trailing|both]要去掉的字符FROM源字符串):该函数能够从“源字符串”中的头(leading)部,或尾(trailing)部,或从头(leading)部和尾(trailing)部(both)中去掉“要去掉的字符”。

        如果没有指定头(leading)或尾(trailing),TRIM函数按默认(both)处理(该函数是8i刚刚引入的,在8i之前的版本中是两个函数LTRIM和RTRIM)。

    SQL> select TRIM('?' FROM '?SQL*PLUS is the SQL implementation
      2              used in an Oracle RDBMS or ORDBMS.')
      3  from dual;
    
    TRIM('?'FROM'?SQL*PLUSISTHESQLIMPLEMENTATIONUSEDINANORACLERDBMSORORDBMS.')
    --------------------------------------------------------------------------------
    SQL*PLUS is the SQL implementation
            used in an Oracle RDBMS or ORDBMS.

        也可以通过下面的查询语句来去掉rows之后的两个问号。

    SQL> select TRIM('?' FROM ' It can process data in sets of rows??')
      2  from dual;
    
    TRIM('?'FROM'ITCANPROCESSDATAINSETSO
    ------------------------------------
     It can process data in sets of rows

        以上两个例子都没有指出是去掉头部的还是尾部的字符,因此Oracle按默认Both来处理。第一个例子只在头部有“?”而第二个例子只在尾部有“?”,所以Oracle系统可以正确的处理。
       下面的例子,TRIM函数的这种用法就要遇到麻烦了。

    SQL> select TRIM('s' FROM 'sql*plus is a fourth generation query languages')
      2  from dual;
    
    TRIM('S'FROM'SQL*PLUSISAFOURTHGENERATIONQUERY
    ---------------------------------------------
    ql*plus is a fourth generation query language

        在上面的SQL语句中,我们是想去掉尾部的“s”,但Oracle系统把开头的和结尾的“s”都去掉了。这显然不是我们所希望的结果。这时我们可以用trailing选项来解决这个问题。

    SQL> select TRIM(trailing 's' FROM 'sql*plus is a fourth generation query languages')
      2  from dual;
    
    TRIM(TRAILING'S'FROM'SQL*PLUSISAFOURTHGENERATI
    ----------------------------------------------
    sql*plus is a fourth generation query language

        在这里就不演示直接使用Leading选项的例子。
        9.REPLACE(正文表达式,要搜寻的字符串,替换字符串):该函数是在"正文表达式"中查找"要搜寻的字符串",如果找到了就用"替换字符串"替代。

    SQL> select REPLACE('SQL*PLUS supports loops or if statements','supports',
      2                 'does not support')
      3  from dual;
    
    REPLACE('SQL*PLUSSUPPORTSLOOPSORIFSTATEMENTS','S
    ------------------------------------------------
    SQL*PLUS does not support loops or if statements

    四、数字型函数
        常用的数字型函数包括:

        ROUND、TRUNC、MOD

        1.ROUND(列名|表达式,n):

        该函数将列名或表达式所表示的数值四舍五入到小数点后的n位。

        2.TRUNC(列名|表达式,n):

        该函数将列名或表达式所表示的数值截取到小数点后的n位。

        3.MOD(m,n):

        该函数将m除以n并取余数。

    SQL> select ROUND(168.888,1),TRUNC(168.888,1)
      2  from dual;
    
    ROUND(168.888,1) TRUNC(168.888,1)
    ---------------- ----------------
           168.9        168.8
    
    SQL> select MOD(300,400)
      2  from dual;
    
    MOD(300,400)
    ------------
         300

    五、日期函数
        首先演示一下查询数据库的时间例子:

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    
    TO_CHAR(SYSDATE,'YY
    -------------------
    2013-07-07 09:44:36

        常用的日期型函数包括:
        MONTHS_BETWEEN、ADD_MONTHS、NEXT_DAY、LAST_DAY

        1.MONTHS_BETWEEN(日期1,日期2):

        该函数是返回日期1和日期2之间的月数。如果日期1大于日期2,其返回的月数为正。如果日期1小于日期2,其返回的月数为负。

        2.ADD_MONTHS(日期,n):

        该函数是把n个月加到日期上。

        3.NEXT_DAY(日期,字符串):

        该函数是返回下一个由字符串(星期几)指定的日期。

        4.LAST_DAY(日期):

        该函数是返回该日期所在月的最后一天。

        一个综合的例子:

    SQL> select ename,hiredate,LAST_DAY(hiredate),NEXT_DAY(hiredate,'SUNDAY'),
      2          MONTHS_BETWEEN(SYSDATE,hiredate) "Months",
      3          ADD_MONTHS(hiredate,3) "Revies"
      4  from emp;
    
    ENAME       HIREDATE  LAST_DAY( NEXT_DAY(     Months Revies
    ---------- --------- --------- --------- ---------- ---------
    SMITH       17-DEC-80 31-DEC-80 21-DEC-80 390.690779 17-MAR-81
    ALLEN       20-FEB-81 28-FEB-81 22-FEB-81 388.594005 20-MAY-81
    WARD       22-FEB-81 28-FEB-81 01-MAR-81 388.529489 22-MAY-81
    JONES       02-APR-81 30-APR-81 05-APR-81  387.17465 02-JUL-81
    MARTIN       28-SEP-81 30-SEP-81 04-OCT-81  381.33594 28-DEC-81
    BLAKE       01-MAY-81 31-MAY-81 03-MAY-81 386.206908 01-AUG-81
    CLARK       09-JUN-81 30-JUN-81 14-JUN-81 384.948844 09-SEP-81
    SCOTT       19-APR-87 30-APR-87 26-APR-87 314.626263 19-JUL-87
    KING       17-NOV-81 30-NOV-81 22-NOV-81 379.690779 17-FEB-82
    TURNER       08-SEP-81 30-SEP-81 13-SEP-81 381.981102 08-DEC-81
    ADAMS       23-MAY-87 31-MAY-87 24-MAY-87 313.497231 23-AUG-87
    JAMES       03-DEC-81 31-DEC-81 06-DEC-81 379.142392 03-MAR-82
    FORD       03-DEC-81 31-DEC-81 06-DEC-81 379.142392 03-MAR-82
    MILLER       23-JAN-82 31-JAN-82 24-JAN-82 377.497231 23-APR-82
    
    14 rows selected.

    六、ROUND和TRUNC函数用于日期型数据
        除了可以把ROUND和TRUNC函数用于数字型数据外,还可以把ROUND和TRUNC函数用于日期型数据。

    SQL> select ROUND(TO_DATE('25-JUL-13'),'MONTH')
      2  from dual;
    
    ROUND(TO_
    ---------
    01-AUG-13
    
    SQL> select TRUNC(TO_DATE('25-JUL-13'),'MONTH')
      2  from dual;
    
    TRUNC(TO_
    ---------
    01-JUL-13
    
    SQL> select ename,hiredate,ROUND(hiredate,'YEAR'),TRUNC(hiredate,'YEAR'),
      2           ROUND(hiredate,'MONTH'),TRUNC(hiredate,'MONTH')
      3  from emp
      4  where hiredate like '%81';
    
    ENAME       HIREDATE  ROUND(HIR TRUNC(HIR ROUND(HIR TRUNC(HIR
    ---------- --------- --------- --------- --------- ---------
    ALLEN       20-FEB-81 01-JAN-81 01-JAN-81 01-MAR-81 01-FEB-81
    WARD       22-FEB-81 01-JAN-81 01-JAN-81 01-MAR-81 01-FEB-81
    JONES       02-APR-81 01-JAN-81 01-JAN-81 01-APR-81 01-APR-81
    MARTIN       28-SEP-81 01-JAN-82 01-JAN-81 01-OCT-81 01-SEP-81
    BLAKE       01-MAY-81 01-JAN-81 01-JAN-81 01-MAY-81 01-MAY-81
    CLARK       09-JUN-81 01-JAN-81 01-JAN-81 01-JUN-81 01-JUN-81
    KING       17-NOV-81 01-JAN-82 01-JAN-81 01-DEC-81 01-NOV-81
    TURNER       08-SEP-81 01-JAN-82 01-JAN-81 01-SEP-81 01-SEP-81
    JAMES       03-DEC-81 01-JAN-82 01-JAN-81 01-DEC-81 01-DEC-81
    FORD       03-DEC-81 01-JAN-82 01-JAN-81 01-DEC-81 01-DEC-81
    
    10 rows selected.

    七、不同数据类型之间的隐含转换
        赋值语句中数据类型之间的隐含转换(Oracle自动转换):

        1.将变长字符型(VARCHAR2)或定长字符型(CHAR)转换成数字型(NUMBER);

        2.将变长字符型(VARCHAR2)或定长字符型(CHAR)转换成日期型(DATE);

        3.将数字型(NUMBER)转换成变长字符型(VARCHAR2);

        4.将日期型(DATE)转换成变长字符型(VARCHAR2)。

    八、不同数据类型之间的显式转换

        Oracle提供了3个转换函数来完成不同数据类型之间的显式转换。

        TO_CHAR、TO_NUMBER、TO_DATE

        1.TO_CHAR(日期,‘fmt'):

        该函数的这种格式把日期型数据转换成变长字符串,其中,fmt为日期模式。

    SQL> select ename,to_char(hiredate,'DD/MM/YY')
      2  from emp
      3  where hiredate like '%82';
    
    ENAME       TO_CHAR(
    ---------- --------
    MILLER       23/01/82

        常用的日期模式:
        a.YYYY:完整的年份数字表示(如2001);

        b.YEAR:年份的英文表示(如NINETEEN EIGHTY-SEVEN);

        c.MM:用两位数字来表示月份;

        d.MONTH:月份完整的英文表示;

        e.DY:用3个英文字符的缩写来表示星期几;

        f.DAY:星期几的完整的英文表示;

        g.DD:几号的数字表示。

        查询员工的名字(Name),工资(Salary)和雇佣日期(HIREDATE)的信息。

    SQL> select ename "Name",sal "Salary",
      2         to_char(hiredate,'fmDdspth "of" Month Year fmHH:MI:SS AM') HIREDATE
      3  from emp;
    
    Name           Salary HIREDATE
    ---------- ---------- ----------------------------------------------------------------------------------------------------
    SMITH          800 Seventeenth of December Nineteen Eighty 12:00:00 AM
    ALLEN         1600 Twentieth of February Nineteen Eighty-One 12:00:00 AM
    WARD         1250 Twenty-Second of February Nineteen Eighty-One 12:00:00 AM
    JONES         2975 Second of April Nineteen Eighty-One 12:00:00 AM
    MARTIN         1250 Twenty-Eighth of September Nineteen Eighty-One 12:00:00 AM
    BLAKE         2850 First of May Nineteen Eighty-One 12:00:00 AM
    CLARK         2450 Ninth of June Nineteen Eighty-One 12:00:00 AM
    SCOTT         3000 Nineteenth of April Nineteen Eighty-Seven 12:00:00 AM
    KING         5000 Seventeenth of November Nineteen Eighty-One 12:00:00 AM
    TURNER         1500 Eighth of September Nineteen Eighty-One 12:00:00 AM
    ADAMS         1100 Twenty-Third of May Nineteen Eighty-Seven 12:00:00 AM
    JAMES          950 Third of December Nineteen Eighty-One 12:00:00 AM
    FORD         3000 Third of December Nineteen Eighty-One 12:00:00 AM
    MILLER         1300 Twenty-Third of January Nineteen Eighty-Two 12:00:00 AM
    
    14 rows selected.

        2.TO_CHAR(数字,‘fmt'):
        该函数的这种格式把数字型数据转换成变长字符串。

        其中,fmt为数字模式。常用的数字模式包括:

        9:位数字;

        0:显示前导零;

        $:显示美元号;

        L:显示本地货币号;

        .:显示小数点;

        ,:显示千位符;

        MI:在数的右边显示减号;

        PR:把负数用尖括号扩起来。

        下面的查询语句用来显示员工的名字(Name)和年薪(Annual Salary),其中显示年薪时要包括美元($)符、千位符(,)和小数点(.),而且要显示小数点后两位数,即使小数点后的数为0也要显示。

    SQL> select ename "Name",TO_CHAR(sal*12,'$99,999.00') "Annual Salary"
      2  from emp;
    
    Name       Annual Sala
    ---------- -----------
    SMITH         $9,600.00
    ALLEN        $19,200.00
    WARD        $15,000.00
    JONES        $35,700.00
    MARTIN        $15,000.00
    BLAKE        $34,200.00
    CLARK        $29,400.00
    SCOTT        $36,000.00
    KING        $60,000.00
    TURNER        $18,000.00
    ADAMS        $13,200.00
    JAMES        $11,400.00
    FORD        $36,000.00
    MILLER        $15,600.00
    
    14 rows selected.

        3.TO_NUMBER(字符串 [,'fmt]‘):
        该函数把字符串转换成数字。

        4.TO_DATE(字符串 [,'fmt]’):

        该函数把字符串转换成日期型数据。

  • 相关阅读:
    菜鸟攻城狮4(基本语法)
    Spring 3.x 企业引用开发实战(陈雄华/林开雄)
    进击的菜鸟问题1(设置checkbox全选)
    Maven实战
    菜鸟攻城狮3(Holle World)
    菜鸟攻城狮2(JAVA开发环境)
    git基本使用
    跨域问题及解决跨域的方案
    原生ajax相关概念
    php服务器语言,MySQL数据库以及php怎么操作数据库
  • 原文地址:https://www.cnblogs.com/Richardzhu/p/3173379.html
Copyright © 2011-2022 走看看