ITPub博客

首页 > 数据库 > Oracle > oracle函数解析大全

oracle函数解析大全

原创 Oracle 作者:410192979 时间:2016-03-22 22:19:46 0 删除 编辑
oracle函数解析大全 
oracle函数大全目录:
nvl   nvl2   decode   coalesca   lpad   rpad   trim   mod   ascii   chr
concat   initcap   instr   length   upper   substr   replace   soundex
leading   trailing   abs   acos   asin   atan   ceil   cos   cosh   exp
floor   ln   log   power   round   trunc   sign   sqrt   tan   tanh   trunc
add_months   last_day   months_between   new_time   next_day
sysdba   chartorowid   convert   hextoraw   rawtohext
rowidtochar   to_char   to_date   to_multi_byte   to_number
bfilename   convert   dump   empty_blob   empty_clob   greatest
least   uid   user    userevn   avg   max   min   stddev   variance
group by   having    order by  
1)
    NVL( string1, replace_with) 
  功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。
2)
    NVL2(expr1,expr2,expr3) 
  功能:如果参数表达式expr1值为NULL,则NVL2()函数返回参数表达式expr3的值;如果参数表达式expr1值不为NULL,则NVL2()函数返回参数表达式expr2的值。
3)
    DECODE(条件,值1,翻译值1,值2,翻译值2,值n,翻译值n,。。。。,缺省值)
      功能:IF 条件=值1        THEN     RETURN(翻译值1)
                ELSIF 条件=值2   THEN  RETURN(翻译值2)
                                      ......
                ELSIF 条件=值n   THEN  RETURN(翻译值n)
                ELSE     RETURN(缺省值)   
                END IF
4)
     coalesce(expression_1, expression_2, ...,expression_n)
       功能:依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。
     SELECT COALESCE(NULL,NULL,3,4,5) FROM dual
     其返回结果为:3
5)instr( string1, string2, start_position,nth_appearance )
    功能: instr返回要截取的字符串在源字符串中的位置
              
string1
源字符串,要在此字符串中查找。
string2
要在string1中查找的字符串 。
start_position
代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
nth_appearance
代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
注意: 
  位置索引号从1开始。
  如果String2在String1中没有找到,instr函数返回0。
  示例: 
  SELECT instr('syranmo','s') FROM dual; -- 返回 1 
  SELECT instr('syranmo','ra') FROM dual; -- 返回 3 
  SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0

6)
   lpad
功能:lpad函数从左边对字符串使用指定的字符进行填充。从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思。
   语法格式如下:
    lpad( string, padded_length, [ pad_string ] )
      string
        准备被填充的字符串;
      padded_length
        填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
      pad_string
        填充字符串,是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。
示例1:
SQL> select lpad('abcde',10,'x') from dual;
LPAD('ABCDE',10,'X')
--------------------
xxxxxabcde
示例2:
SQL> select lpad('abcde',10,'oq') from dual;
LPAD('ABCDE',10,'OQ')
---------------------
oqoqoabcde
示例3:
SQL> select lpad('abcde',2) from dual;
LPAD('ABCDE',2)
---------------
ab
7)
     rpad(string,padded_length,[pad_string])
       rpad函数从右边对字符串使用指定的字符进行填充
string
被填充的字符串
padded_length
字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,rpad函数将会把字符串截取成从左到右的n个字符;
pad_string
是个可选参数,这个字符串是要粘贴到string的右边,如果这个参数未写,lpad函数将会在string的右边粘贴空格。
例如:
rpad('tech', 7); 将返回'tech '
rpad('tech', 2); 将返回'te'
rpad('tech', 8, '0'); 将返回'tech0000'
rpad('tech on the net', 15, 'z'); 将返回 'tech on the net'
rpad('tech on the net', 16, 'z'); 将返回 'tech on the netz'
8)
 TRIM
Trim ( string );
功能:删除字符串中多余的空格,但会在英文字符串中保留一个作为词与词之间分隔的空格。
参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串("")。 如果参数值为null时,会抛出空指针异常。
SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾。最常见的用途是移除字首或字尾的空白。这个函数在不同的资料库中有不同的名称:
MySQL: TRIM(), RTRIM(), LTRIM()
Oracle: RTRIM(), LTRIM()
SQL Server: RTRIM(), LTRIM()

各种 trim 函数的语法如下:
LTRIM(字串):将字串左边的空格移除。
RTRIM(字串): 将字串右边的空格移除。
TRIM(字串): 将字串首尾两端的空格移除,作用等于RTRIM和LTRIM两个函数共同的结果。
ALLTRIM(字串):将字串左右边两边的空格移除。
例1:
TRIM(' Sample ');
结果:
'Sample'
例2:
LTRIM(' Sample ');
结果:
'Sample '
例3:
? RTRIM(' Sample ');
结果:
' Sample'
ALLTRIM(" Sample ")
结果:
"Sample"
在oracle中,trim()函数的用法有,leading 开头字符,trailing 结尾字符,both 开头和结尾字符,如下:
trim(leading || trailing || both '将要被替换掉的字符" from “将要被替换的字符串")
1、trim函数去除指定的开头字符
select trim(leading 'x' from 'xday') as strTemp from tableName ;
2、trim函数去除指定的结尾字符
select trim(trailing 'x' from 'dayx') as strTemp from tableName ;
3、trim函数去除指定的首部和尾部字符
select trim(both 'x' from 'xdayx') as strTemp from tableName ;
4、默认情况下,trim函数会去除首部和尾部,被指定的字符
select trim('x' from 'xdayx') as strTemp from tableName ;
5、如果没有指定被移除的字符,则会默认去除首部和尾部的空格
select trim(' day ') as strTemp from tableName ;
9)
mod(nExp1,nExp2)
mod函数是一个求余函数,其格式为: mod(nExp1,nExp2),即是两个数值表达式作除法运算后的余数。那么:两个同号整数求余与你所知的两个正数求余完全一样(即两个负整数与两个正整数的算法一样)
语法:MOD(number,divisor)
参数:
Number 为被除数。
Divisor 为除数。如果 divisor 为零,函数 MOD 返回值 为原来number
MOD(n, d) = n - d*INT(n/d)
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
        A         A      ZERO     SPACE
--------- --------- --------- ---------
       65        97        48        32

2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C
-- -
赵 A
3.CONCAT
连接两个字符串;
SQL> select concat('010-','88888888')||'转23'  高乾竞电话 from dual;
高乾竞电话
----------------
010-88888888转23
4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;
UPP
-----
Smith

5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1    被搜索的字符串
C2    希望搜索的字符串
I     搜索的开始位置,默认为1
J     出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;
 INSTRING
---------
        9

6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;
NAME   LENGTH(NAME) ADDR             LENGTH(ADDR)       SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞            3 北京市海锭区                6   9999.99                    7
 
7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;
AABBCCDD
--------
aabbccdd

8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;
UPPER
--------
AABBCCDD
 




11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3,8) from dual;
SUBSTR('
--------
08888888

12.REPLACE('string','s1','s2')
string   希望被替换的字符或变量 
s1       被替换的字符串
s2       要替换的字符串
SQL> select replace('he love you','he','i') from dual;
REPLACE('H
----------
i love you

13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');
SQL> select xm from table1 where soundex(xm)=soundex('weather');
XM
--------
weather
wether

14.TRIM('s' from 'string')
LEADING   剪掉前面的字符
TRAILING  剪掉后面的字符
如果不指定,默认为空格符
15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;
 ABS(100) ABS(-100)
--------- ---------
      100       100

16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;
 ACOS(-1)
---------
3.1415927

17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;
ASIN(0.5)
---------
.52359878

18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;
  ATAN(1)
---------
.78539816

19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;
CEIL(3.1415927)
---------------
              4

20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;
COS(-3.1415927)
---------------
             -1

21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;
 COSH(20)
---------
242582598

22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;
   EXP(2)    EXP(1)
--------- ---------
7.3890561 2.7182818

23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;
FLOOR(2345.67)
--------------
          2345

24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;
    LN(1)     LN(2) LN(2.7182818)
--------- --------- -------------
        0 .69314718     .99999999

25.LOG(n1,n2)
返回一个以n1为底n2的对数 
SQL> select log(2,1),log(2,4) from dual;
 LOG(2,1)  LOG(2,4)
--------- ---------
        0         2



27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;
POWER(2,10) POWER(3,3)
----------- ----------
       1024         27

28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
         56          -55          55          -55

29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;
SIGN(123) SIGN(-100)   SIGN(0)
--------- ---------- ---------
        1         -1         0

30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;
SIN(1.57079)
------------
           1

31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;
  SIN(20)  SINH(20)
--------- ---------
.91294525 242582598

32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;
 SQRT(64)  SQRT(10)
--------- ---------
        8 3.1622777

33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;
  TAN(20)   TAN(10)
--------- ---------
2.2371609 .64836083

34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;
 TANH(20)   TAN(20)
--------- ---------
        1 2.2371609
 
35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;
   TRUNC1 TRUNC(124.16666,2)
--------- ------------------
      100             124.16
 
36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;
TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;
TO_CHA
------
199910

37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;
TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;
LAST_DAY(S
----------
31-5月 -04

38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;
MON_BETWEEN
-----------
          9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;
 MON_BETW
---------
      -60

39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
  2  (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;
BJ_TIME             LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32

40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;
NEXT_DAY
----------
25-5月 -01
 
41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;
TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
  2  to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;
HH                  HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00
 
42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;
ROWID              ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES

43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;
conver
------
strutz

44.HEXTORAW
将一个十六进制构成的字符串转换为二进制

45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制
 
46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型
 
47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41
 
48.TO_DATE(string,'format')
将字符串转化为ORACLE中的一个日期

49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL>  select to_multi_byte('高') from dual;
TO
--


50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number('1999') year from dual;
     YEAR
---------
     1999

51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));

52.CONVERT('x','desc','source')
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
  2  0,'none',
  3  2,'insert',
  4  3,
  5  'select',
  6  6,'update',
  7  7,'delete',
  8  8,'drop',
  9  'other') cmd  from v$session where type!='background';
      SID   SERIAL# USERNAME                       CMD
--------- --------- ------------------------------ ------
        1         1                                none
        2         1                                none
        3         1                                none
        4         1                                none
        5         1                                none
        6         1                                none
        7      1275                                none
        8      1275                                none
        9        20 GAO                            select
       10        40 GAO                            none

53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;
GLOBAL_NAME                    DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD                   Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D

54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数

55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest('AA','AB','AC') from dual;
GR
--
AC
SQL> select greatest('啊','安','天') from dual;
GR
--


56.LEAST
返回一组表达式中的最小值 
SQL> select least('啊','安','天') from dual;
LE
--


57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid;
USERNAME                         USER_ID
------------------------------ ---------
GAO                                   25
 
58.USER
返回当前用户的名字
SQL> select user from  dual;
USER
------------------------------
GAO

59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA  查看当前用户是否是DBA如果是则返回true
SQL> select userenv('isdba') from dual;
USEREN
------
FALSE
SQL> select userenv('isdba') from dual;
USEREN
------
TRUE
SESSION
返回会话标志
SQL> select userenv('sessionid') from dual;
USERENV('SESSIONID')
--------------------
                 152
ENTRYID
返回会话人口标志
SQL> select userenv('entryid') from dual;
USERENV('ENTRYID')
------------------
                 0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv('instance') from dual;
USERENV('INSTANCE')
-------------------
                  1
LANGUAGE
返回当前环境变量
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv('lang') from dual;
USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv('terminal') from dual;
USERENV('TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual;
VSIZE(USER) USER
----------- ------------------------------
          6 SYSTEM
 
60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理。
SQLWKS>  insert into table3 values('gao',1111.11);
SQLWKS>  insert into table3 values('gao',1111.11);
SQLWKS>  insert into table3 values('zhu',5555.55);
SQLWKS> commit;
SQL> select avg(distinct sal) from gao.table3;
AVG(DISTINCTSAL)
----------------
         3333.33
SQL> select avg(all sal) from gao.table3;
AVG(ALLSAL)
-----------
    2592.59

61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp;
MAX(DISTINCTSAL)
----------------
            5000

62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;
MIN(ALLSAL)
-----------
    1111.11

63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp;
STDDEV(SAL)
-----------
  1182.5032
SQL> select stddev(distinct sal) from scott.emp;
STDDEV(DISTINCTSAL)
-------------------
           1229.951
 
64.VARIANCE(DISTINCT|ALL)
求协方差
SQL> select variance(sal) from scott.emp;
VARIANCE(SAL)
-------------
    1398313.9

65.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;
   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       10         3      8750
       20         5     10875
       30         6      9400
 
66.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;
   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;
   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400

67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;
   DEPTNO ENAME            SAL
--------- ---------- ---------
       10 KING            5000
       10 CLARK           2450
       10 MILLER          1300
       20 SCOTT           3000
       20 FORD            3000
       20 JONES           2975
       20 ADAMS           1100
       20 SMITH            800
       30 BLAKE           2850
       30 ALLEN           1600
       30 TURNER          1500
       30 WARD            1250
       30 MARTIN          1250
       30 JAMES            950
复杂查询语句的使用
1.查询语句的使用
使用 select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.

1.1相关子查询
可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询
  .where中可以包含一个select语句的子查询
  .where中可以包含in,exists语句
  .最多可以嵌套16层
  .层次过多会影响性能
  [例]简单子查询实例
  查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目
  (按规定只能以一个单位来申请)
  SQL> create table univ_subject
  2    (
  3       name                 varchar2(12) not null,
  4       per_id                number     not null,
  5      dept_name       varchar2(20)            
  6    );
  SQL> insert into univ_subject  values('gaoqianjing',1001,'信息工程系');
  SQL> insert into univ_subject  values('wangbing',1002,'物理系');
  SQL> insert into univ_subject  values('liming',1003,'化学系');
  ===============
   SQL> create table  colle_subject
  2     (
  3              colle_name    varchar2(20),
  4              per_id              number
  5     );
  SQL> insert into colle_subject values('电子研究所',1001);
  SQL>  insert into colle_subject values('物理研究所',1005);
  ================
  SQL> select name,per_id,dept_name from univ_subject where per_id in
  2    (select per_id from colle_subject);

  NAME            PER_ID   DEPT_NAME
  ------------          ---------     --------------------
  gaoqianjing  1001      信息工程系

1.2外连接
[例]外连接实例
招生中所有学生的信息放在students表中,而部分有特长的学生在另一个表中stuent_skill中同样有该学生
的信息。现在要全部列出所有学生,如果某个学生在表student_skill中就有其特长信息,并显示特长信息,如果
某个学生没有特长就显示特长问空.
SQL>  create table students
  2    (
  3       st_id    varchar2(20),
  4       name  varchar2(10),
  5       age      number(2),
  6       tol_score   number(3)
  7    ) ;
SQL>   insert into students values('973231','wangbindu',22,501);
SQL>   insert into students values('973232','zhuzhijing',21,538);
SQL>  insert into students values('973233','gaojing',21,576);
===================

SQL>  create table student_skill
  2   (
  3      st_id  varchar2(20),
  4      skill    varchar2(20)
  5  );
SQL>  insert into student_skill values('973231','篮球');
SQL>  insert into student_skill(st_id) values('973232');
SQL>  insert into student_skill values('973233','足球');
===================

SQL>   select a.* , b.skill from students a,student_skill b where a.st_id=b.st_id(+)
order by a.st_id;

ST_ID                NAME             AGE TOL_SCORE SKILL
-------------------- ---------- --------- --------- ------------------  --
973231               wangbindu         22       501        篮球
973232               zhuzhijing           21       538
973233               gaojing                21       576        足球

1.3自我连接
自我连接是在同一个表或视图内进行条件连接.
[例]自我连接实例
查询每个雇员的名字和该雇员的经理的名字:
SQL> select e1.ename||'   work for   '||e2.ename "Employees and their Managers"
  2  from  scott.emp e1,scott.emp e2 where e1.mgr=e2.empno;

Employees and their Managers
-------------------------------------------------
SMITH      work for   FORD
ALLEN     work for   BLAKE
WARD      work for   BLAKE
JONES     work for   KING
MARTIN   work for   BLAKE
BLAKE     work for   KING
CLARK     work for   KING
SCOTT      work for   JONES
TURNER  work for   BLAKE
ADAMS     work for   SCOTT
JAMES      work for   BLAKE
FORD        work for   JONES
MILLER     work for   CLARK

1.4UNION , INTERSECT及 MINUS
UNION:            可以将两个以上的表的相类似的查询结果放在一起 (union all则表示返回所有的行)
具体语法:
select ...
union[all]
select...
==========

INTERSECT:  返回两个表中相同的信息
具体语法:
select ...
intersect
select...
==========

MINUS          :  返回一个表中出现的信息
具体语法:
select ...
minus
select...
[例1]UNION操作实例
SQL> select  st_id  from students
  2  union
  3  select  st_id  from student_skill;

ST_ID
--------------------
973231
973232
973233

[例2]INTERSECT操作实例
列出有特长的学生的学号
SQL> select st_id from students
  2  intersect
  3  select st_id from student_skill;
ST_ID
--------------------
973231
973233

[例3]MINUS操作实例
列出没有特长学生的学号
select st_id from students
minus
select st_id from student_skill;
ST_ID
--------------------
973232


2.创建复杂的视图
许多应用系统有统计等功能,建议最好把这些复杂语句写成视图.下面是几个常用的视图.
2.1分组视图
[例1]简单的分组视图
SQL> create or replace view dept_tot as
  2  select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b
  3  where a.deptno=b.deptno group by a.dname;

查看已建立。
SQL> select * from dept_tot;

DEPT                           TOTAL_SAL
--------------                     ---------
ACCOUNTING          8750
RESEARCH              10875
SALES                        9400

[例2]带复杂函数视图
SQL> create or replace view itemtot as
  2  select persion,sum(amount) itemtot from ledger
  3  where actiondate between
  4  to_date('01-MAR-1901','dd-mon-yyyy') and
  5  to_date('31-MAR-1901','dd-mon-yyyy')
  6  and action in('bought','raid') group by persion;

2.2合计视图
[例]合计函数视图实例
SQL> create or replace view emp_no1  as
  2  select deptno,sum(sal) 工资和,sum(comm) 总和
  3  from scott.emp group by deptno;
SQL> select * from emp_no1;
DEPTNO    工资和      总和
--------- --------- ---------
       10      8750
       20     10875
       30      9400      2200

2.3组合视图
[例]带组合函数的视图
SQL> create or replace view byitem as
  2  select l.persion persion.item, amount, 100*amount/item bypersion,100*amount/total bytotal
  3  from ledgent l,itemtotal i,total where l.persion=i.persion where l.persion=i.persion
  4  and actiondate between
  5  to_date('01-MAR-1901','dd-mon-yyyy') and
  6  to_date('31-MAR-1901','dd-mon-yyyy')
  7   and action in('bought','raid') ;

3.家族树
语法:
select column from table_name start with column=value
connect by prior 父主键=子主键

3.1排除单一性和分枝
以ORACLE中的EMP表为例
[例]从顶到底列出各雇员的信息
SQL> select lpad(' ',4*(level-1))||ename name,empno,mgr from emp start with mgr is null
  2  connect by prior empno=mgr;

NAME                                 EMPNO       MGR
---------                                  ---------           ---------
KING                                   7839           
    JONES                           7566            7839
          SCOTT                     7788            7566
                ADAMS              7876            7788

3.2遍历至根
[例1]现在要从某个雇员开始向他的上级列出该雇员的层次结构
SQL> col ename for a30;
SQL> select lpad(' ',4*(level-1))||ename ename,mgr,empno from scott.emp
  2  start with mgr=7788 connect by prior mgr=empno;
ENAME                                MGR     EMPNO
------------------------------         ---------    ---------
ADAMS                               7788      7876
    SCOTT                           7566       7788
        JONES                       7839       7566
            KING                                        7839

[例2]列出所有雇员的层次结构
SQL> select lpad(' ',4*(level-1))||ename ename,empno,mgr from scott.emp
  2  start with mgr is not null
  3  connect by empno=prior mgr;

ENAME                              EMPNO       MGR
------------------------------       ---------           ---------
SMITH                               7369          7902
    FORD                            7902         7566
        JONES                       7566        7839
            KING                    7839
ALLEN                               7499        7698
    BLAKE                           7698        7839
        KING                        7839
WARD                                7521        7698
    BLAKE                           7698        7839
        KING                        7839
JONES                               7566        7839
    KING                            7839
MARTIN                              7654        7698
    BLAKE                           7698         7839
        KING                        7839
BLAKE                               7698        7839
    KING                            7839
CLARK                               7782         7839
    KING                            7839
SCOTT                               7788         7566
    JONES                           7566        7839
201. /*+NOCACHE(TABLE)*/
  当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端。
  例如:
  SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
  202. /*+APPEND*/
  直接插入到表的最后,可以提高速度。
    insert/*+append*/into test1 select*from test4;
  203. /*+NOAPPEND*/
  通过在插入语句生存期内停止并行模式来启动常规插入。
    insert/*+noappend*/into test1 select*from test4;
  ORACLE内部函数
  204.如何得到字符串的第一个字符的ASCII值?
  ASCII(CHAR)
  SELECTASCII('ABCDE') FROM DUAL;
  --结果: 65
  205. 如何得到数值N指定的字符?
  CHR(N)
  SELECT CHR(68) FROM DUAL;
  --结果: D
  206. 如何连接两个字符串?
  CONCAT(CHAR1,CHAR2)
  SELECT CONCAT('ABC','DEFGH') FROM DUAL;
  --结果: 'ABCDEFGH'
  207. 如何将列中的数值代替为字符串?
  DECODE(CHAR,N1,CHAR1,N2,CHAR2...)
  SELECT DECODE(DAY,1,'SUN',2,'MON') FROM DUAL;
  208. INITCAP(CHAR)
  将字符串CHAR的第一个字符为大写,其余为小写。
  SELECT INITCAP('ABCDE') FROM DUAL;
  209. LENGTH(CHAR)
  取一字符串CHAR的长度。
  SELECT LENGTH('ABCDE') FROM DUAL;
  210. LOWER(CHAR)
  将字符串CHAR全部变为小写。
  SELECTLOWER('ABCDE') FROM DUAL;
  211. LPAD(CHAR1,N,CHAR2)
  用字符串CHAR2包括的字符左填CHAR1,使其长度为N。
  SELECT LPAD('ABCDEFG',10'123') FROM DUAL;
  --结果: '123ABCDEFG'
  212. LTRIM(CHAR,SET)
  从字符串CHAR的左边移去字符串SET中的字符,直到第一个不是SET中的字符为止。
  SELECT ('CDEFG','CD') FROM DUAL;
  --结果: 'EFG'
 
 
  213. NLS_INITCAP(CHAR)
  取字符CHAR的第一个字符大写,其余字符为小写。
  SELECT NLS_INITCAP('ABCDE') FROM DUAL;
  214. NLS_LOWER(CHAR)
  将字符串CHAR包括的字符全部小写。
  SELECT NLS_LOWER('AAAA') FROM DUAL;
  215. NLS_UPPER(CHAR)
  将字符串CHAR包括的字符全部大写。
  SELECT NLS_UPPER('AAAA') FROM DUAL;
  216. REPLACE(CHAR1,CHAR2,CHAR3)
  用字符串CHAR3代替每一个列值为CHAR2的列,其结果放在CHAR1中。
  SELECTREPLACE(EMP_NO,'123','456') FROM DUAL;
  217. RPAD(CHAR1,N,CHAR2)
  用字符串CHAR2右填字符串CHAR1,使其长度为N。
  SELECT RPAD('234',8,'0') FROM DUAL;
  218. RTRIM(CHAR,SET)
  移去字符串CHAR右边的字符串SET中的字符,直到最后一个不是SET中的字符为止。
  SELECTRTRIM('ABCDE','DE') FROM DUAL;
  219. SUBSTR(CHAR,M,N)
  得到字符串CHAR从M处开始的N个字符. 双字节字符,一个汉字为一个字符的。
  SELECT SUBSTR('ABCDE',2,3) FROM DUAL;
  220. SUBSTRB(CHAR,M,N)
  得到字符串CHAR从M处开始的N个字符. 双字节字符,一个汉字为二个字符的。
  SELECT SUBSTRB('ABCDE',2,3) FROM DUAL;
  221. TRANSLATE(CHAR1,CHAR2,CHAR3)
  将CHAR1中的CHAR2的部分用CHAR3代替。
  SELECT TRANSLATE('ABCDEFGH','DE','MN') FROM DUAL;
  222. UPPER(CHAR)
  将字符串CHAR全部为大写。
  223. ADD_MONTHS(D,N)
  将N个月增加到D日期。
  SELECT ADD_MONTHS(SYSDATE,5) FROM DUAL;
  224. LAST_DAY(D)
  得到包含D日期的月份的最后的一天的日期。
  SELECT LAST_DAY(SYSDATE) FROM DUAL;
  225. MONTH_BETWEEN(D1,D2)
  得到两个日期之间的月数。
  SELECT MONTH_BETWEEN(D1,D2) FROM DUAL;
 
  226. NEXT_DAY(D,CHAR)
  得到比日期D晚的由CHAR命名的第一个周日的日期。
  SELECT NEXT_DAY(TO_DATE('2003/09/20'),'SATDAY') FROM DUAL;
  227. ROUNT(D,FMT)
  得到按指定的模式FMT舍入到的最进的日期。
  SELECT ROUNT('2003/09/20',MONTH) FROM DUAL;
  228. SYSDATE
  得到当前系统的日期和时间。
  SELECT SYSDATE FROM DUAL;
  229. TO_CHAR(D,FMT)
  将日期D转换为FMT的字符串。
  SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD') FROM DUAL;
  230. TO_DATE(CHAR,FMT)
  将字符串CHAR按FMT的格式转换为日期。
  SELECT TO_DATE('2003/09/20','YYYY/MM/DD') FROM DUAL;
  231. ABS(N)
  得到N的绝对值。
  SELECTABS(-6) FROM DUAL;
  232. CEIL(N)
  得到大于或等于N的最大整数。
  SELECT CEIL(5.6) FROM DUAL;
  233. COS(N)
  得到N的余弦值。
  SELECTCOS(1) FROM DUAL;
  234. SIN(N)
  得到N的正弦值。
  SELECT SIN(1) FROM DUAL;
  235. COSH(N)
  得到N的双曲余弦值。
  SELECT COSH(1) FROM DUAL;
  236. EXP(N)
  得到N的E的N次幂。
  SELECT EXP(1) FROM DUAL;
  237. FLOOR(N)
  得到小于或等于N的最小整数。
  SELECT FLOOR(5.6) FROM DUAL;
  238. LN(N)
  得到N的自然对数。
  SELECT LN(1) FROM DUAL;
  239. LOG(M,N)
  得到以M为底N的对数。
  SELECT LOG(2,8) FROM DUAL;
  240. MOD(M,N)
  得到M除以N的余数。
  SELECT MOD(100,7) FROM DUAL;
 
  241. POWER(M,N)
  得到M的N幂。
  SELECT POWER(4,3) FROM DUAL;
  242. ROUND(N,M)
  将N舍入到小数点后M位。
  SELECT (78.87653,2) FROM DUAL;
  243. SIGN(N)
  当N<0时,得到-1;
  当N>0时,得到1;
  当N=0时,得到0;
  SELECT SIGN(99) FROM DUAL;
  244. SINH(N)
  得到N的双曲正弦值。
  SELECT SINH(1) FROM DUAL;
  245. SORT(N)
  得到N的平方根,N>=0
  SELECT SORT(9) FROM DUAL;
  246. TAN(N)
  得到N的正切值。
  SELECT TAN(0) FROM DUAL;
  247. TANH(N)
  得到N的双曲正切值。
  SELECT TANH(0) FROM DUAL;
  248. TRUNC(N,M)
  得到在M位截断的N的值。
  SELECT TRUNC(7.7788,2) FROM DUAL;
  249. COUNT()
  计算满足条件的记录数。
  SELECT COUNT(*) FROM TABLE1 WHERE COL1='AAA';
  250. MAX()
  对指定的列求最大值。
  SELECT MAX(COL1) FROMTABLE1;
  251. MIN()
  对指定的列求最小值。
  SELECT MIN(COL1) FROMTABLE1;
  252. AVG()
  对指定的列求平均值。
  SELECT AVG(COL1) FROMTABLE1;
  253. SUM()
  计算列的和。
  SELECT SUM(COL1) FROM DUAL;
  254. TO_NUMBER(CHAR)
  将字符转换为数值。
  SELECT TO_NUMBER('999') FROM DUAL;
  255. CHARTOROWID(CHAR)
  将包含外部语法ROWID的CHAR或VARCHAR2数值转换为内部的二进制语法,参数CHAR必须是包含外部语法的ROWID的18字符的字符串。
  SELECT NAME FROM BSEMPMS WHERE ROWID=CHARTOROWID('AAAAfZAABAAACp8AAO');
  --NAME : LEIXUE
 
  256. CONVERT(CHAR,DEST_CHAR_SET,SOURCE_CHAR_SET)
  CONVERT将字符串CHAR中的字符从SOURCE_CHAR_SET标识的字符集转换为由DEST_CHAR_SET标识的字符集。
  SELECTCONVERT('GroB','US7ASCII','WE8HP') 'CONVERSION'FROM PUBS;
  --CONVERSION: Gross
  257. HEXTORAW(CHAR)
  将包含十六进制的CHAR转换为一个RAW数值。
  INSERT INTO BSEMPMS(RAW_COLUMN) SELECTHEXTORAW('7D') FROM TEST;
  258. RAWTOHEX(RAW)
  将RAW数值转换为一个包含十六进制的CHAR值。
  SELECT RAWTOHEX(RAW_COLUMN) 'CONVERSION'FROM BSEMPMS;
  --CONVERSION: 7D
  259. ROWIDTOCHAR(ROWID)
  将一个ROWID数值转换为VARCHAR2数据类型。
  SELECT ROWID FROM BSEMPMS WHEREROWIDTOCHAR(ROWID) LIKE '%BR1AAB%';
  260. TO_MULTI_BYTE(CHAR)
  将CHAR中的单字节转换为等价的多字节字符。
  SELECT TO_MULTI_BYTE('ASFDFD') FROM TEST;
  261. TO_SINGLE_BYTE(CHAR)
  将CHAR中的多字节转换为等价的单字节字符。
  SELECT TO_SINGLE_BYTE('ASFDFD') FROM TEST;
  262. TRANSLATE USING(TEXT USING {CHAR_CS|NCHAR_CS})
  将文本TEXT按照指定的转换方式转换成数据库字符集和民族字符集。
  其中TEXT是待转换的。
  USING CHAR_CS参数转换TEXT为数据库字符集,输出数据类型是VARCHAR2。
  USING NCHAR_CS参数转换TEXT为数据库字符集,输出数据类型是NVARCHAR2。
  CREATETABLE TEST(CHAR_COL CHAR(20),NCHAR_COL NCHAR(20));
  INSERTINTO TEST VALUES('HI,N'BYE');
  SELECT * FROM TEST;
  263. DUMP(EXPR,RETURN_FORMAT,START_POSITION,LENGTH)
  返回一个包含数据类型代码,字节长度等内部表示信息的VARCHAR2值.返回结果是当前数据库字符集,数据类型按照下面规定的内部数据类型的编码作为一个数字进行返回:
  代码数据类型
  0 VARCHAR2
  1 NUMBER
  8 LONG
  12 DATE
  23 RAW
  24 LONG RAW
  69 ROWID
  96 CHAR
  106MSSLABEL
  参数RETUEN_FORMAT指定按照下面的基数表示返回的数值。
  RETURN_FORMAT RESULT
  8 8进制
  10 10进制
  16 16进制
  17 单字符表示
  如果参数RETURN_FORMAT没有指定,则按十进制表示返回。
  如果参数START_POSITION和LENGTH被指定,则从START_POSITION开始的长为LENGTH的字节将被返回,缺省是返回整数表示。
  SELECTDUMP('ABC',1016) FROM TEST;
  selectdump(ename,8,3,2) 'example'from emp where name='ccbzzp';
  264. empty_b|clob()
  返回一个空的LOB定位符,用在初始化LOB变量,或用在INSERT及UPDATE声明去初始化LOB列或将其属性置为空。
  INSERTINTO TABLE1 VALUES(EMPTY_BLOB());
  UPDATE TABLE1 SETCLOB_COL=EMPTY_BLOB();
 
  265. BFILENAME('DIRECTORY','FILENAME')
  返回一个BFILE定位符,相关的二进制LOB物理文件在服务器的文件系统上.目录DIRECTORY是指在服务器的文件系统上实际搜索路径全名的别名. FILENAME是指服务器的文件系统的文件名。
  INSERTINTO FILE_TAB VALUES(BFILENAME('LOB_DIR','IMAGE1.GIF'));
  266. GREATEST(EXPR,EXPR,...)
  GREATEST返回参数的最大值。
  SELECT GREATEST('HARRY','HARRIOT','HAROLD') 'SAMPLE'FROM TABLE1;
  267. LEAST(EXPR,EXPR,...)
  LEAST返回参数的最小值。
  SELECT LEAST('HARRY','HARRIOT','HAROLD') 'SAMPLE'FROM TABLE1;
  268. NLS_CHARSET_DECL_LEN(BYTECNT,CSID)
  返回一个NCHAR列的宽度。
  SELECT NLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('JA16EEFDFDF')) FROM TABLE1;
  269. NLS_CHARSET_ID(TEXT)
  返回相应于NLS字符集名字的NLS字符集ID数。
  SELECT NLS_CHARSET_D('JADFDFFDF') FROM TABLE1;
  270. NLS_CHARSET_NAME(N)
  返回相应于ID数N的NLS字符集名称。
  SELECT NLS_CHARSET_NAME(2) FROM TABLE1;
  271. NVL(EXPR1,EXPR2)
  若EXPR1是NULL,则返回EXPR2,否则返回EXPR1。
  SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;
  272. UID
  返回唯一标识当前数据库用户的整数。
  SELECT UID FROM TABLE1;
  273. USER
  用VARCHAR2数据类型返回当前ORACLE用户的名称。
  SELECTUSER,UID FROM TABLE1;
  274. USERENV(OPTION)
  返回当前的会话信息。
  OPTION='ISDBA'若当前是DBA角色,则为TRUE,否则FALSE。
  OPTION='LANGUAGE'返回数据库的字符集。
  OPTION='SESSIONID'为当前会话标识符。
  OPTION='ENTRYID'返回可审计的会话标识符。
  OPTION='LANG'返回会话语言名称的ISO简记。
  OPTION='INSTANCE'返回当前的实例。
  SELECT USERENV('LANGUAGE') FROM DUAL;
  275. VSIZE(EXPR)
  返回EXPR内部表示的字节数。
  SELECT NAME,VSIZE(NAME) FROM TABLE1;
  276. DEREF(E)
  返回参数E的对象引用。
  SELECT DEREF(C2) FROM TABLE1;
  277. REFTOHEX(R)
  将参数R转换为16进制。
  SELECT REFTOHEX(C2) FROM TABLE1;
 
  278. MAKE_REF(TABLE,KEY,KEY...)
  通过把给定的键作为主键来创建给定视图对象中一行的引用。
  CREATE TYPE T1 AS OBJECT(A NUMBER,B NUMBER);
  CREATETABLE TB1(C1 NUMBER,C2 NUMBER,PRIMARYKEY(C1,C2));
  CREATEVIEW V1 OF T1 WITH OBJECT OID(A,ASSELECT*FROM TB1;
  SELECT MAKE_REF(V1,1,3) FROM PUBS;
  279. STDDEV(DISTINCT|ALL X)
  STDDEV给出一组行值的标准差。
  SELECT STDDEV(SALARY) AS EXAMPLE FROMEMPLOYEE;
  280. VARIANCE(DISTINCT|ALL X)
  VARIANCE返回一组行中所有VALUE的方差。
  SELECT VARIANCE(SALARY) ASEXAMPLE FROM EMPLOYEE;
  管理视图
  281. VACCESS
  显示当前被锁定的数据库中的对象及正在访问他们的会话。
  282. VACTIVE_INSTANCES
  为当前安装的数据库中出现的所有实例建立从实例名到实例号的映射。
  283. VACTIVE_SESS_POOL_MTH
  所有活动的会话池资源分配方法。
  284. VAQ
  当前数据库中的队列的统计量。
  285. VARCHIVE
  归档所需的重做日志文件中的信息。
  286. VARCHIVE_DEST
  当前实例的所有归档日志目的文件及它们的当前值,模式,状态。
  287. VARCHIVE_PROCESSES
  为一个实例提供不同的ARCH进程状态的信息。
  288. VARCHIVE_LOG
  控制文件中的归档日志信息。
  289. VBACKUP
  所有联机数据文件的备份状态。
  290. VBACKUP_ASYNC_IO
  从控制文件中显示备份集的信息。
  291. VBACKUP_CORRUPTION
  从控制文件中显示数据文件备份中有关损坏的信息。
  292. VBACKUP_DATAFILE
  从控制文件中显示备份数据文件和备份控制文件的信息。
  293. VBACKUP_DEVICE
  显示关于支持备份设备的信息。
  294. VBACKUP_PIECE
  从控制文件中显示备份块的信息。
  295. VBACKUP_REDOLOG
  从控制文件中显示关于备份集中归档日志的信息。
  296. VBACKUP_SET
  从控制文件中显示备份集的信息。
  297. VBACKUP_SYNC_IO
  从控制文件中显示备份集的信息。
  298. VBGPROCESS
  描述后台进程。
  299. VBH
  实时应用集群视为系统全局区中的每一个缓冲区给出了状态和探查次数。
  300. VBSP
  显示用在缓存中块服务器后台进程上的统计信息。
ORACLE常用数值函数、转换函数、字符串函数
发布:dxy 字体:[增加 减小] 类型:转载
本文并不准备介绍全部的oracle函数,当前情势下,俺也还没这个时间,需要学习的东西太多了,要把多数时间花在学习经常能用上的技术方面:),所以如果是准备深入了解所有oracle函数的朋友,还是去关注:Oracle SQL Reference官方文档更靠谱一些。
本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数。分二类介绍,分别是:
  著名函数篇 -经常用到的函数
  非著名函数篇-即虽然很少用到,但某些情况下却很实用

注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  单值函数在查询中返回单个值,可被应用到select,where子句,start with以及connect by 子句和having子句。
(一).数值型函数(Number Functions)
数值型函数输入数字型参数并返回数值型的值。多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点。

1、MOD(n1,n2) 返回n1除n2的余数,如果n2=0则返回n1的值。
例如:SELECT MOD(24,5) FROM DUAL;

2、ROUND(n1[,n2]) 返回四舍五入小数点右边n2位后n1的值,n2缺省值为0,如果n2为负数就舍入到小数点左边相应的位上(虽然oracle documents上提到n2的值必须为整数,事实上执行时此处的判断并不严谨,即使n2为非整数,它也会自动将n2取整后做处理,但是我文档中其它提到必须为整的地方需要特别注意,如果不为整执行时会报错的)。
例如:SELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL;

3、TRUNC(n1[,n2] 返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。
例如:SELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;

(二).字符型函数返回字符值(Character Functions Returning Character Values)
  该类函数返回与输入类型相同的类型。
? 返回的CHAR类型值长度不超过2000字节;
? 返回的VCHAR2类型值长度不超过4000字节;
如果上述应返回的字符长度超出,oracle并不会报错而是直接截断至最大可支持长度返回。

? 返回的CLOB类型值长度不超过4G;
对于CLOB类型的函数,如果返回值长度超出,oracle不会返回任何错误而是直接抛出错误。

1、LOWER(c) 将指定字符串内字符变为小写,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB类型
例如:SELECT LOWER('WhaT is tHis') FROM DUAL;

2、UPPER(c) 将指定字符串内字符变为大写,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB类型
例如:SELECT UPPER('WhaT is tHis') FROM DUAL;

3、LPAD(c1,n[,c2]) 返回指定长度=n的字符串,需要注意的有几点:
? 如果n<c1.length则从右到左截取指定长度返回;
? 如果n>c1.length and c2 is null,以空格从左向右补充字符长度至n并返回;
? 如果n>c1.length and c2 is not null,以指定字符c2从左向右补充c1长度至n并返回;
例如:SELECT LPAD('WhaT is tHis',5),LPAD('WhaT is tHis',25),LPAD('WhaT is tHis',25,'-') FROM DUAL;
最后大家再猜一猜,如果n<0,结果会怎么样

4、RPAD(c1,n[,c2]) 返回指定长度=n的字符串,基本与上同,不过补充字符是从右向左方向正好与上相反;
例如:SELECT RPAD('WhaT is tHis',5),RPAD('WhaT is tHis',25),RPAD('WhaT is tHis',25,'-') FROM DUAL;

5、TRIM([[LEADING||TRAILING||BOTH] c2 FROM] c1) 哈哈,被俺无敌的形容方式搞晕头了吧,这个地方还是看图更明了一些。
看起来很复杂,理解起来很简单:
? 如果没有指定任何参数则oracle去除c1头尾空格
例如:SELECT TRIM(' WhaT is tHis ') FROM DUAL;
? 如果指定了c2参数,则oracle去掉c1头尾c2(这个建议细致测试,有多种不同情形的哟)
例如:SELECT TRIM('W' FROM 'WhaT is tHis w W') FROM DUAL;
? 如果指定了leading参数则会去掉c1头部c2
例如:SELECT TRIM(leading 'W' FROM 'WhaT is tHis w W') FROM DUAL;
? 如果指定了trailing参数则会去掉c1尾部c2
例如:SELECT TRIM(trailing 'W' FROM 'WhaT is tHis w W') FROM DUAL;
? 如果指定了both参数则会去掉c1头尾c2(跟不指定有区别吗?没区别!)
例如:SELECT TRIM(both 'W' FROM 'WhaT is tHis w W') FROM DUAL;

注意:c2长度=1

6、LTRIM(c1[,c2]) 千万表以为与上面那个长的像,功能也与上面的类似,本函数是从字符串c1左侧截取掉与指定字符串c2相同的字符并返回。如果c2为空则默认截取空格。
例如:SELECT LTRIM('WWhhhhhaT is tHis w W','Wh') FROM DUAL;

7、RTRIM(c1,c2)与上同,不过方向相反
例如:SELECT RTRIM('WWhhhhhaT is tHis w W','W w') FROM DUAL;

8、REPLACE(c1,c2[,c3]) 将c1字符串中的c2替换为c3,如果c3为空,则从c1中删除所有c2。
例如:SELECT REPLACE('WWhhhhhaT is tHis w W','W','-') FROM DUAL;

9、SOUNDEX(c) 神奇的函数啊,该函数返回字符串参数的语音表示形式,对于比较一些读音相同,但是拼写不同的单词非常有用。计算语音的算法如下:
? 保留字符串首字母,但删除a、e、h、i、o、w、y。
? 将下表中的数字赋给相对应的字母:
1:b、f、p、v
2:c、g、k、q、s、x、z
3:d、t
4:l
5:m、n
6:R
? 如果字符串中存在拥有相同数字的2个以上(包含2个)的字母在一起(例如b和f),或者只有h或w,则删除其他的,只保留1个;
? 只返回前4个字节,不够用0填充
例如:SELECT SOUNDEX('dog'),soundex('boy') FROM DUAL;

10、SUBSTR(c1,n1[,n2]) 截取指定长度的字符串。稍不注意就可能充满了陷阱的函数。
n1=开始长度;
n2=截取的字符串长度,如果为空,默认截取到字符串结尾;
? 如果n1=0 then n1=1
? 如果n1>0,则oracle从左向右确认起始位置截取
例如:SELECT SUBSTR('What is this',5,3) FROM DUAL;
? 如果n1<0,则oracle从右向左数确认起始位置
例如:SELECT SUBSTR('What is this',-5,3) FROM DUAL;
? 如果n1>c1.length则返回空
例如:SELECT SUBSTR('What is this',50,3) FROM DUAL;
然后再请你猜猜,如果n2<1,会如何返回值呢

11、TRANSLATE(c1,c2,c3) 就功能而言,此函数与replace有些相似。但需要注意的一点是,translate是绝对匹配替换,这点与replace函数具有非常大区别。什么是绝对匹配替换呢?简单的说,是将字符串c1中按一定的格式c2替换为c3。如果文字形容仍然无法理解,我们通过几具实例来说明:
例如:
SELECT TRANSLATE('What is this','','-') FROM DUAL;
SELECT TRANSLATE('What is this','-','') FROM DUAL;
结果都是空。来试试这个:
SELECT TRANSLATE('What is this',' ',' ') FROM DUAL;
再来看这个:
SELECT TRANSLATE('What is this','ait','-*') FROM DUAL;
是否明白了点呢?Replace函数理解比较简单,它是将字符串中指定字符替换成其它字符,它的字符必须是连续的。而translate中,则是指定字符串c1中出现的c2,将c2中各个字符替换成c3中位置顺序与其相同的c3中的字符。明白了?Replace是替换,而translate则像是过滤

(三).字符型函数返回数字值(Character Functions Returning Number Values)
本类函数支持所有的数据类型

1、INSTR(c1,c2[,n1[,n2]]) 返回c2在c1中位置
? c1:原字符串
? c2:要寻找的字符串
? n1:查询起始位置,正值表示从左到右,负值表示从右到左 (大小表示位置,比如3表示左面第3处开始,-3表示右面第3处开始)。黑黑,如果为0的话,则返回的也是0
? n2:第几个匹配项。大于0
例如:SELECT INSTR('abcdefg','e',-3) FROM DUAL;

2、LENGTH(c) 返回指定字符串的长度。如果
例如:SELECT LENGTH('A123中') FROM DUAL;
猜猜SELECT LENGTH('') FROM DUAL;的返回值是什么

(四).日期函数(Datetime Functions)
本类函数中,除months_between返回数值外,其它都将返回日期。

1、ADD_MONTHS() 返回指定日期月份+n之后的值,n可以为任何整数。
例如:SELECT ADD_MONTHS(sysdate,12),ADD_MONTHS(sysdate,-12) FROM DUAL;

2、CURRENT_DATE 返回当前session所在时区的默认时间
例如:
SQL> alter session set nls_date_format = 'mm-dd-yyyy' ;
SQL> select current_date from dual;

3、SYSDATE 功能与上相同,返回当前session所在时区的默认时间。但是需要注意的一点是,如果同时使用sysdate与current_date获得的时间不一定相同,某些情况下current_date会比sysdate快一秒。经过与xyf_tck(兄台的大作ORACLE的工作机制写的很好,深入浅出)的短暂交流,我们认为current_date是将current_timestamp中毫秒四舍五入后的返回,虽然没有找到文档支持,但是想来应该八九不离十。同时,仅是某些情况下会有一秒的误差,一般情况下并不会对你的操作造成影响,所以了解即可。
例如:SELECT SYSDATE,CURRENT_DATE FROM DUAL;

4、LAST_DAY(d) 返回指定时间所在月的最后一天
例如:SELECT last_day(SYSDATE) FROM DUAL;

5、NEXT_DAY(d,n) 返回指定日期后第一个n的日期,n为一周中的某一天。但是,需要注意的是n如果为字符的话,它的星期形式需要与当前session默认时区中的星期形式相同。
例如:三思用的中文nt,nls_language值为SIMPLIFIED CHINESE
SELECT NEXT_DAY(SYSDATE,5) FROM DUAL;
SELECT NEXT_DAY(SYSDATE,'星期四') FROM DUAL;
两种方式都可以取到正确的返回,但是:
SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL;
则会执行出错,提供你说周中的日无效,就是这个原因了。

6、MONTHS_BETWEEN(d1,d2) 返回d1与d2间的月份差,视d1,d2的值大小,结果可正可负,当然也有可能为0
例如:
SELECT months_between(SYSDATE, sysdate),
months_between(SYSDATE, add_months(sysdate, -1)),
months_between(SYSDATE, add_months(sysdate, 1))
FROM DUAL;

7、ROUND(d[,fmt]) 前面讲数值型函数的时候介绍过ROUND,此处与上功能基本相似,不过此处操作的是日期。如果不指定fmt参数,则默认返回距离指定日期最近的日期。
例如:SELECT ROUND(SYSDATE,'HH24') FROM DUAL;

8、TRUNC(d[,fmt]) 与前面介绍的数值型TRUNC原理相同,不过此处也是操作的日期型。
例如:SELECT TRUNC(SYSDATE,'HH24') FROM DUAL;

(五).转换函数(Conversion Functions)
转换函数将指定字符从一种类型转换为另一种,通常这类函数遵循如下惯例:函数名称后面跟着待转换类型以及输出类型。

1、TO_CHAR() 本函数又可以分三小类,分别是
? 转换字符->字符TO_CHAR(c):将nchar,nvarchar2,clob,nclob类型转换为char类型;
例如:SELECT TO_CHAR('AABBCC') FROM DUAL;

? 转换时间->字符TO_CHAR(d[,fmt]):将指定的时间(data,timestamp,timestamp with time zone)按照指定格式转换为varchar2类型;
例如:SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;

? 转换数值->字符TO_CHAR(n[,fmt]):将指定数值n按照指定格式fmt转换为varchar2类型并返回;
例如:SELECT TO_CHAR(-100, 'L99G999D99MI') FROM DUAL;

2、TO_DATE(c[,fmt[,nls]]) 将char,nchar,varchar2,nvarchar2转换为日期类型,如果fmt参数不为空,则按照fmt中指定格式进行转换。注意这里的fmt参数。如果ftm为'J'则表示按照公元制(Julian day)转换,c则必须为大于0并小于5373484的正整数。
例如:
SELECT TO_DATE(2454336, 'J') FROM DUAL;
SELECT TO_DATE('2007-8-23 23:25:00', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;

为什么公元制的话,c的值必须不大于5373484呢?因为Oracle的DATE类型的取值范围是公元前4712年1月1日至公元9999年12月31日。看看下面这个语句:
SELECT TO_CHAR(TO_DATE('9999-12-31','yyyy-mm-dd'),'j') FROM DUAL;

3、TO_NUMBER(c[,fmt[,nls]]) 将char,nchar,varchar2,nvarchar2型字串按照fmt中指定格式转换为数值类型并返回。
例如:SELECT TO_NUMBER('-100.00', '9G999D99') FROM DUAL;

(六).其它辅助函数(Miscellaneous Single-Row Functions)

1、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。
exp做为初始参数。s做为对比值,相同则返回r,如果s有多个,则持续遍历所有s,直到某个条件为真为止,否则返回默认值def(如果指定了的话),如果没有默认值,并且前面的对比也都没有为真,则返回空。
毫无疑问,decode是个非常重要的函数,在实现行转列等功能时都会用到,需要牢记和熟练使用。

例如:select decode('a2','a1','true1','a2','true2','default') from dual;

2、GREATEST(n1,n2,...n) 返回序列中的最大值
例如:SELECT GREATEST(15,5,75,8) "Greatest" FROM DUAL;

3、LEAST(n1,n2....n) 返回序列中的最小值
例如:SELECT LEAST(15,5,75,8) LEAST FROM DUAL;

4、NULLIF(c1,c2)
Nullif也是个很有意思的函数。逻辑等价于:CASE WHEN c1 = c2 THEN NULL ELSE c1 END
例如:SELECT NULLIF('a','b'),NULLIF('a','a') FROM DUAL;

5、NVL(c1,c2) 逻辑等价于IF c1 is null THEN c2 ELSE c1 END。c1,c2可以是任何类型。如果两者类型不同,则oracle会自动将c2转换为c1的类型。
例如:SELECT NVL(null, '12') FROM DUAL;

6、NVL2(c1,c2,c3) 大家可能都用到nvl,但你用过nvl2吗?如果c1非空则返回c2,如果c1为空则返回c3
例如:select nvl2('a', 'b', 'c') isNull,nvl2(null, 'b', 'c') isNotNull from dual;

7、SYS_CONNECT_BY_PATH(col,c) 该函数只能应用于树状查询。返回通过c1连接的从根到节点的路径。该函数必须与connect by 子句共同使用。
例如:
create table tmp3(
rootcol varchar2(10),
nodecol varchar2(10)
);

insert into tmp3 values ('','a001');
insert into tmp3 values ('','b001');
insert into tmp3 values ('a001','a002');
insert into tmp3 values ('a002','a004');
insert into tmp3 values ('a001','a003');
insert into tmp3 values ('a003','a005');
insert into tmp3 values ('a005','a008');
insert into tmp3 values ('b001','b003');
insert into tmp3 values ('b003','b005');

select lpad(' ', level*10,'=') ||'>'|| sys_connect_by_path(nodecol,'/')
from tmp3
start with rootcol = 'a001'
connect by prior nodecol =rootcol;

8、SYS_CONTEXT(c1,c2[,n]) 将指定命名空间c1的指定参数c2的值按照指定长度n截取后返回。
Oracle9i提供内置了一个命名空间USERENV,描述了当前session的各项信息,其拥有下列参数:
? CURRENT_SCHEMA:当前模式名;
? CURRENT_USER:当前用户;
? IP_ADDRESS:当前客户端IP地址;
? OS_USER:当前客户端操作系统用户;
等等数十项,更详细的参数列还请大家直接参考Oracle Online Documents

例如:SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL;
注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

单值函数在查询中返回单个值,可被应用到select,where子句,start with以及connect by 子句和having子句。
(一).数值型函数(Number Functions)
数值型函数输入数字型参数并返回数值型的值。多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点。

1、ABS(n) 返回数字的绝对值
例如:SELECT ABS(-1000000.01) FROM DUAL;

2、COS(n) 返回n的余弦值
例如:SELECT COS(-2) FROM DUAL;

3、ACOS(n) 反余弦函数,n between -1 and 1,返回值between 0 and pi。
例如:SELECT ACOS(0.9) FROM DUAL;

4、BITAND(n1,n2) 位与运算,这个太有意思了,虽然没想到可能用到哪里,详细说明一下:
假设3,9做位与运算,3的二进制形式为:0011,9的二进制形式为:1001,则结果是0001,转换成10进制数为1。
例如:SELECT BITAND(3,9) FROM DUAL;

5、CEIL(n) 返回大于或等于n的最小的整数值
例如:SELECT ceil(18.2) FROM DUAL;
考你一下,猜猜ceil(-18.2)的值会是什么呢

6、FLOOR(n) 返回小于等于n的最大整数值
例如:SELECT FLOOR(2.2) FROM DUAL;
再猜猜floor(-2.2)的值会是什么呢

7、BIN_TO_NUM(n1,n2,....n) 二进制转向十进制
例如:SELECT BIN_TO_NUM(1),BIN_TO_NUM(1,0),BIN_TO_NUM(1,1) FROM DUAL;

8、SIN(n) 返回n的正玄值,n为弧度。
例如:SELECT SIN(10) FROM DUAL;

9、SINH(n) 返回n的双曲正玄值,n为弧度。
例如:SELECT SINH(10) FROM DUAL;

10、ASIN(n) 反正玄函数,n between -1 and 1,返回值between pi/2 and -pi/2。
例如:SELECT ASIN(0.8) FROM DUAL;

11、TAN(n) 返回n的正切值,n为弧度
例如:SELECT TAN(0.8) FROM DUAL;

12、TANH(n) 返回n的双曲正切值,n为弧度
例如:SELECT TANH(0.8) FROM DUAL;

13、ATAN(n) 反正切函数,n表示弧度,返回值between pi/2 and -pi/2。
例如:SELECT ATAN(-444444.9999999) FROM DUAL;

14、EXP(n) 返回e的n次幂,e = 2.71828183 ...
例如:SELECT EXP(3) FROM DUAL;

15、LN(n) 返回n的自然对数,n>0
例如:SELECT LN(0.9) FROM DUAL;

16、LOG(n1,n2) 返回以n1为底n2的对数,n1 >0 and not 1 ,n2>0
例如:SELECT LOG(1.1,2.2) FROM DUAL;

17、POWER(n1,n2) 返回n1的n2次方。n1,n2可以为任意数值,不过如果m是负数,则n必须为整数
例如:SELECT POWER(2.2,2.2) FROM DUAL;

18、SIGN(n) 如果n<0返回-1,如果n>0返回1,如果n=0返回0.
例如:SELECT SIGN(14),SIGN(-14),SIGN(0) FROM DUAL;

19、SQRT(n) 返回n的平方根,n为弧度。n>=0
例如:SELECT SQRT(0.1) FROM DUAL;

(二).字符型函数返回字符值(Character Functions Returning Character Values)
  该类函数返回与输入类型相同的类型。
? 返回的CHAR类型值长度不超过2000字节;
? 返回的VCHAR2类型值长度不超过4000字节;
如果上述应返回的字符长度超出,oracle并不会报错而是直接截断至最大可支持长度返回。

? 返回的CLOB类型值长度不超过4G;
对于CLOB类型的函数,如果返回值长度超出,oracle不会返回任何错误而是直接抛出错误。

1、CHR(N[ USING NCHAR_CS]) 返回指定数值在当前字符集中对应的字符
例如:SELECT CHR(95) FROM DUAL;

2、CONCAT(c1,c2) 连接字符串,等同于||
例如:SELECT concat('aa','bb') FROM DUAL;

3、INITCAP(c) 将字符串中单词的第一个字母转换为大写,其它则转换为小写
例如:SELECT INITCAP('whaT is this') FROM DUAL;

4、NLS_INITCAP(c) 返回指定字符串,并将字符串中第一个字母变大写,其它字母变小写
例如:SELECT NLS_INITCAP('中华miNZHu') FROM DUAL;
它还具有一个参数:Nlsparam用来指定排序规则,可以忽略,默认状态该参数为当前session的排序规则。

(三).字符型函数返回数字值(Character Functions Returning Number Values)
本类函数支持所有的数据类型
1、ASCII(c) 与chr函数的用途刚刚相反,本函数返回指定字符在当前字符集下对应的数值。
例如:SELECT ASCII('_') FROM DUAL;

(四).日期函数(Datetime Functions)
本类函数中,除months_between返回数值外,其它都将返回日期。
1、CURRENT_TIMESTAMP([n]) 返回当前session所在时区的日期和时间。n表示毫秒级的精度,不大于6
例如:SELECT CURRENT_TIMESTAMP(3) FROM DUAL;

2、LOCALTIMESTAMP([n]) 与上同,返回当前session所在时区的日期和时间。n表示毫秒级的精度,不大于6
例如:SELECT LOCALTIMESTAMP(3) FROM DUAL;

3、SYSTIMESTAMP([n]) 与上同,返回当前数据库所在时区的日期和时间,n表示毫秒级的精度,>0 and <6
例如:SELECT SYSTIMESTAMP(4) FROM DUAL;

4、DBTIMEZONE 返回数据库的当前时区
例如:SELECT DBTIMEZONE FROM DUAL;

5、SESSIONTIMEZONE 返回当前session所在时区
例如:SELECT SESSIONTIMEZONE FROM DUAL;

6、EXTRACT(key from date) key=(year,month,day,hour,minute,second) 从指定时间提到指定日期列
例如:SELECT EXTRACT(year from sysdate) FROM DUAL;

7、TO_TIMESTAMP(c1[,fmt]) 将指定字符按指定格式转换为timestamp格式。
例如:SELECT TO_TIMESTAMP('2007-8-22', 'YYYY-MM-DD HH:MI:SS') FROM DUAL;

(五).转换函数(Conversion Functions)
转换函数将指定字符从一种类型转换为另一种,通常这类函数遵循如下惯例:函数名称后面跟着待转换类型以及输出类型。

1、BIN_TO_NUM(n1,n2...n) 将一组位向量转换为等价的十进制形式。
例如:SELECT BIN_TO_NUM(1,1,0) FROM DUAL;

2、CAST(c as newtype) 将指定字串转换为指定类型,基本只对字符类型有效,比如char,number,date,rowid等。此类转换有一个专门的表列明了哪种类型可以转换为哪种类型,此处就不作酹述。
例如:SELECT CAST('1101' AS NUMBER(5)) FROM DUAL;

3、CHARTOROWID(c) 将字符串转换为rowid类型
例如:SELECT CHARTOROWID('A003D1ABBEFAABSAA0') FROM DUAL;

4、ROWIDTOCHAR(rowid) 转换rowid值为varchar2类型。返回串长度为18个字节。
例如:SELECT ROWIDTOCHAR(rowid) FROM DUAL;

5、TO_MULTI_BYTE(c) 将指定字符转换为全角并返回char类型字串
例如:SELECT TO_MULTI_BYTE('ABC abc 中华') FROM DUAL;

6、TO_SINGLE_BYTE(c) 将指定字符转换为半角并返回char类型字串
例如:SELECT TO_SINGLE_BYTE('ABC abc中华') FROM DUAL;

(六).其它辅助函数(Miscellaneous Single-Row Functions)
1、COALESCE(n1,n2,....n) 返回序列中的第一个非空值
例如:SELECT COALESCE(null,5,6,null,9) FROM DUAL;

2、DUMP(exp[,fmt[,start[,length]]])
dump是个功能非常强悍的函数,对于深入了解oracle存储的人而言相当有用。所以对于我们这些仅仅只是应用的人而言就不知道能将其应用于何处了。此处仅介绍用法,不对其功能做深入分析。

如上所示,dump拥有不少参数。其本质是以指定格式,返回指定长度的exp的内部表示形式的varchar2值。fmt含4种格式:8||10||16||17,分别表示8进制,10进制,16进制和单字符,默认为10进制。start参数表示开始位置,length表示以,分隔的字串数。
例如:SELECT DUMP('abcdefg',17,2,4) FROM DUAL;

3、EMPTY_BLOB,EMPTY_CLOB 这两个函数都是返回空lob类型,通常被用于insert和update等语句以初始化lob列,或者将其置为空。EMPTY表示LOB已经被初始化,只不过还没有用来存储数据。

4、NLS_CHARSET_NAME(n) 返回指定数值对应的字符集名称。
例如:SELECT NLS_CHARSET_NAME(1) FROM DUAL;

5、NLS_CHARSET_ID(c) 返回指定字符对应的字符集id。
例如:SELECT NLS_CHARSET_ID('US7ASCII') FROM DUAL;

6、NLS_CHARSET_DECL_LEN(n1,n2) 返回一个NCHAR值的声明宽度(以字符为单位).n1是该值以字节为单位的长度,n2是该值的字符集ID
例如:SELECT NLS_CHARSET_DECL_LEN(100, nls_charset_id('US7ASCII')) FROM DUAL;

7、SYS_EXTRACT_UTC(timestamp) 返回标准通用时间即格林威治时间。
例如:SELECT SYS_EXTRACT_UTC(current_timestamp) FROM DUAL;

8、SYS_TYPEID(object_type) 返回对象类型对应的id。
例如:这个这个,没有建立过自定义对象,咋做示例?

9、UID 返回一个唯一标识当前数据库用户的整数。
例如:SELECT UID FROM DUAL;

10、USER 返回当前session用户
例如:SELECT USER FROM DUAL;

11、USERENV(c) 该函数用来返回当前session的信息,据oracle文档的说明,userenv是为了保持向下兼容的遗留函数。oracle公司推荐你使用sys_context函数调用USERENV命名空间来获取相关信息,所以大家了解下就行了。
例如:SELECT USERENV('LANGUAGE') FROM DUAL;

12、VSIZE(c) 返回c的字节数。
例如:SELECT VSIZE('abc中华') FROM DUAL; 
oracle 日期函数集合(集中版本)
在oracle数据库的开发中,常因为时间的问题大费周章,所以特地将ORACLE数据的日期函数收藏致此。乃供他日所查也。 
add_months(d,n) 日期d加n个月 
last_day(d) 包含d的月?的最后一天的日期 
new_time(d,a,b) a?区的日期和??d在b?区的日期和?? 
next_day(d,day) 比日期d?,由day指定的周几的日期 
sysdate 当前的系?日期和?? 
greatest(d1,d2,...dn) ?出的日期列表中最后的日期 
least(d1,k2,...dn) ?出的日期列表中最早的日期 
to_char(d [,fmt]) 日期d按fmt指定的格式??成字符串 
to_date(st [,fmt]) 字符串st按fmt指定的格式?成日期?,若fmt忽略,st要用缺省格式 
round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期 
trunc(d [,fmt]) 日期d按fmt指定格式截断到最近的日期 
to_date 字符串类型转为换日期类型 
字符串中的相应位置上的字符,必须符合时间范围的限制 

查询Oracle日期格式 
---------------------------------- 


select * from nls_database_parameters; 


得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式. 
PARAMETER VALUE 
----------------------------------- ----------------------------------- 
NLS_LANGUAGE AMERICAN 
NLS_TERRITORY AMERICA 
NLS_CURRENCY $ 
NLS_ISO_CURRENCY AMERICA 
NLS_NUMERIC_CHARACTERS ., 
NLS_CHARACTERSET ZHS16GBK 
NLS_CALENDAR GREGORIAN 
NLS_DATE_FORMAT DD-MON-RR 
NLS_DATE_LANGUAGE AMERICAN 
NLS_SORT BINARY 
NLS_TIME_FORMAT HH.MI.SSXFF AM 
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM 
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM 
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM 
NLS_DUAL_CURRENCY $ 
NLS_COMP BINARY 
NLS_NCHAR_CHARACTERSET ZHS16GBK 
NLS_RDBMS_VERSION 8.1.7.0.0 

或者查询V$NLS_PARAMETERS表, 
select * from V$NLS_PARAMETERS; 
也有类似结果 

SQL>select to_date('2004-11-12 12-07-32','yyyy-mm-dd hh24-mi-ss') value from dual; 
VALUE 
------------------- 
2004.11.12 12:07:32 

SQL>select to_date('20041015') value from dual; 
VALUE 
------------------- 
2004.10.15 00:00:00 

SQL>select to_date('20041315') value from dual; 
ERROR 位于第 1 行: 
ORA-01861: 文字与格式字符串不匹配 


sysdate 当前日期和时间 

SQL>select sysdate value from dual; 
VALUE 
------------------- 
2003.11.23 17:09:01 


last_day 本月最后一天 

SQL>select last_day(sysdate) value from dual; 
VALUE 
------------------- 
2003.11.30 17:08:17 


add_months(d,n) 日期d后推n个月 

SQL>select add_months(sysdate,2) value from dual; 
VALUE 
------------------- 
2005.01.23 17:10:21 


next_day(d,day) 日期d之后的第一周中,指定的那天(指定星期的第几天)是什么日期 

SQL>select next_day(sysdate,1) value from dual; 
VALUE 
------------------- 
2004.11.28 17:38:55 




[oracle/plsql]oracle日期处理完全版 

日期处理完全版 
TO_DATE格式 
Day: 
dd number 12 
dy abbreviated fri 
day spelled out friday 
ddspth spelled out, ordinal twelfth 
Month: 
mm number 03 
mon abbreviated mar 
month spelled out march 
Year: 
yy two digits 98 
yyyy four digits 1998 

24小时格式下时间范围为: 0:00:00 - 23:59:59.... 
12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 
1. 
日期和字符转换函数用法(to_date,to_char) 

2. 
select to_char( to_date(222,'J'),'Jsp') from dual 

显示Two Hundred Twenty-Two 

3. 
求某天是星期几 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 
星期一 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from

dual; 
monday 
设置日期语言 
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 
也可以这样 
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 

4. 
两个日期间的天数 
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; 

5. 时间为null的用法 
select id, active_date from table1 
UNION 
select 1, TO_DATE(null) from dual; 

注意要用TO_DATE(null) 

6. 
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 
所以,当时间需要精确的时候,觉得to_char还是必要的 
7. 日期格式冲突问题 
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' 
alter system set NLS_DATE_LANGUAGE = American 
alter session set NLS_DATE_LANGUAGE = American 
或者在to_date中写 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from

dual; 
注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 
可查看 
select * from nls_session_parameters 
select * from V$NLS_PARAMETERS 

8. 
select count(*) 
from ( select rownum-1 rnum 
from all_objects 
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 
02-01','yyyy-mm-dd')+1 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) 
not 
in ( '1', '7' ) 

查找2002-02-28至2002-02-01间除星期一和七的天数 
在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). 

9. 
select months_between(to_date('01-31-1999','MM-DD-YYYY'), 
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 


select months_between(to_date('02-01-1999','MM-DD-YYYY'), 
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 

1.03225806451613 
10. Next_day的用法 
Next_day(date, day) 

Monday-Sunday, for format code DAY 
Mon-Sun, for format code DY 
1-7, for format code D 

11 
select to_char(sysdate,'hh:mi:ss') TIME from all_objects 
注意:第一条记录的TIME 与最后一行是一样的 
可以建立一个函数来处理这个问题 
create or replace function sys_date return date is 
begin 
return sysdate; 
end; 

select to_char(sys_date,'hh:mi:ss') from all_objects; 
12. 
获得小时数 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer 
SQL> select sysdate ,to_char(sysdate,'hh') from dual; 

SYSDATE TO_CHAR(SYSDATE,'HH') 
-------------------- --------------------- 
2003-10-13 19:35:21 07 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual; 

SYSDATE TO_CHAR(SYSDATE,'HH24') 
-------------------- ----------------------- 
2003-10-13 19:35:21 19 

获取年月日与此类似 
13. 
年月日的处理 
select older_date, 
newer_date, 
years, 
months, 
abs( 
trunc( 
newer_date- 
add_months( older_date,years*12+months ) 

) days 
from ( select 
trunc(months_between( newer_date, older_date )/12) YEARS, 
mod(trunc(months_between( newer_date, older_date )), 
12 ) MONTHS, 
newer_date, 
older_date 
from ( select hiredate older_date, 
add_months(hiredate,rownum)+rownum newer_date 
from emp ) 


14. 
处理月份天数不定的办法 
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual 

16. 
找出今年的天数 
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 

闰年的处理方法 
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' ) 
如果是28就不是闰年 

17. 
yyyy与rrrr的区别 
'YYYY99 TO_C 
------- ---- 
yyyy 99 0099 
rrrr 99 1999 
yyyy 01 0001 
rrrr 01 2001 

18.不同时区的处理 
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate 
from dual; 

19. 
5秒钟一个间隔 
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') 
from dual 

2002-11-1 9:55:00 35786 
SSSSS表示5位秒数 

20. 
一年的第几天 
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual 
310 2002-11-6 10:03:51 

21.计算小时,分,秒,毫秒 
select 
Days, 
A, 
TRUNC(A*24) Hours, 
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, 
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, 
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds 
from 

select 
trunc(sysdate) Days, 
sysdate - trunc(sysdate) A 
from dual 



select * from tabname 
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); 

// 
floor((date2-date1) /365) 作为年 
floor((date2-date1, 365) /30) 作为月 
mod(mod(date2-date1, 365), 30)作为日. 
23.next_day函数 
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 

很简单的一句话。 
把Oracle的日期当作一个特殊数字,以天为单位。 
可以进行 日期+数字 = 日期, 日期-日期=数字,日期-数字=日期 

MESTAMP数据的格式化显示和DATE 数据一样。注意,to_char函数支持date和timestamp,但是trunc却不支持TIMESTAMP数据类型。这已经清楚表明了在当两个时间的差别极度重要的情况下,使用TIMESTAMP数据类型要比DATE数据类型更确切。 
   
  如果你想显示TIMESTAMP的小数秒信息,参考下面: 
   
  1 SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS:FF3') "Date" FROM date_table 
   
  Date 
   
  ----------------------- 
   
  06/20/2003 16:55:14:000 
   
  06/26/2003 11:16:36:000 
   
  在上例中,我只现实了小数点后3位的内容。 
   
  计算timestamp间的数据差别要比老的date数据类型更容易。当你直接相减的话,看看会发生什么。结果将更容易理解,第一行的17天,18小时,27分钟和43秒。 
   
  1 SELECT time1, 
   
   2     time2, 
   
   3     substr((time2-time1),instr((time2-time1),' ')+7,2)         seconds, 
   
   4     substr((time2-time1),instr((time2-time1),' ')+4,2)         minutes, 
   
   5     substr((time2-time1),instr((time2-time1),' ')+1,2)         hours, 
   
   6     trunc(to_number(substr((time2-time1),1,instr(time2-time1,' '))))  days, 
   
   7     trunc(to_number(substr((time2-time1),1,instr(time2-time1,' ')))/7) weeks 
   
   8*  FROM date_table 
   
  TIME1            TIME2           SECONDS MINUTES HOURS DAYS WEEKS 
   
  -------------------------  -------------------------- ------- ------- ----- ---- ----- 
   
  06/20/2003:16:55:14:000000 07/08/2003:11:22:57:000000 43   27   18  17  2 
   
  06/26/2003:11:16:36:000000 07/08/2003:11:22:57:000000 21   06   00  12  1 
   
  这就意味着不再需要关心一天有多少秒在麻烦的计算中。因此,得到天数、月数、天数、时数、分钟数和秒数就成为用substr函数摘取出数字的事情了。 
   
  系统日期和时间 
   
  为了得到系统时间,返回成date数据类型。你可以使用sysdate函数。 
   
  SQL> SELECT SYSDATE FROM DUAL; 
   
  为了得到系统时间,返回成timestamp数据类型。你可以使用systimpstamp函数。 
   
  SQL> SELECT SYSTIMESTAMP FROM DUAL; 
   
  你可以设置初始化参数FIXED_DATE指定sysdate函数返回一个固定值。这用在测试日期和时间敏感的代码。注意,这个参数对于systimestamp函数无效。 
   
  SQL> ALTER SYSTEM SET fixed_date = '2003-01-01-10:00:00'; 
   
  System altered. 
   
  SQL> select sysdate from dual; 
   
  SYSDATE 
   
  --------- 
   
  01-JAN-03 
   
  SQL> select systimestamp from dual; 
   
  SYSTIMESTAMP 
   
  --------------------------------------------------------- 
   
  09-JUL-03 11.05.02.519000 AM -06:00 
   
  当使用date和timestamp类型的时候,选择是很清楚的。你可以随意处置date和timestamp类型。当你试图转换到更强大的timestamp的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。 


DateDiff( month, waterpay.CopyDate, GetDate() ) = 1 ) 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26366371/viewspace-2062134/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-03-08

  • 博文量
    151
  • 访问量
    108993