轉(zhuǎn)載:oracle中的函數(shù)
Oracle已經(jīng)內(nèi)建了許多函數(shù),不同的函數(shù)有不同的作用和用法,有的函數(shù)只能作用在一個(gè)記錄行上,有的能夠作用在多個(gè)記錄行上,不同的函數(shù)可能處理不同的數(shù)據(jù)類型。常見(jiàn)的有兩類,單行函數(shù)和分組函數(shù) 。單行函數(shù):
單行函數(shù) |
|||
分類 | 函數(shù) | 功能 | 示例 |
字符函數(shù) | LPAD(<c1>,<i>[,<c2>]) | 在字符串 c1 的左邊添加字符串 c2 直到 c1 字符串的長(zhǎng)度等于 i 。 |
SELECT? LPAD(‘Hello!’,8,’ ’) leftpad,RPAD(‘Hello!’,8,’ ’) rightpad FROM DUAL;
|
RPAD(<c1>,<i>[,<c2>]) | 在字符串 c1 的右邊添加字符串 c2 直到 c1 字符串的長(zhǎng)度等于 i 。 | ||
LOWER(<c1>) | 把字符串 c1 轉(zhuǎn)換為小寫(xiě) | SELECT LOWER(ename)? one,UPPER(ename) two, INITCAP(ename) FROM EMP; | |
UPPER(<c1>) | 把字符串 c1 轉(zhuǎn)換為大寫(xiě) | ||
INITCAP(<c1>) | 把 c1 字符串的每一個(gè)單詞的第一個(gè)字母轉(zhuǎn)換成大寫(xiě)字母 | ||
LENGTH(<c1>) | 返回字符串 c1 的長(zhǎng)度 | SELECT LENGTH(‘How are you’) FROM DUAL; | |
SUBSTR(<c1>,<i>[,<j>]) | 返回字符串 c1 中從第 i 個(gè)位置開(kāi)始的 j 個(gè)字符(向右)。如果省略 j ,則返回 c1 中從第 i 個(gè)位置開(kāi)始的所有字符。如果 j 為負(fù),則返回字符串 c1 中從第 i 個(gè)位置開(kāi)始的 j 個(gè)字符(向左)。 | SELECT SUBSTR(‘Hello,World’,1,5) FROM DUAL; | |
INSTR(<c1>,<c2>[,<i>[,<j>]]) | 在 c1 中從位置 i 開(kāi)始查找 c2 在 c1 中出第 j 次的位置, i 可以為負(fù) ( 此時(shí),從 c1 的尾部開(kāi)始 ) 。 |
SELECT INSTR(‘Mississippi’,’i’,3,3) FROM DUAL; 返回結(jié)果 11 。 SELECT INSTR(‘Mississippi’,’i’,-2,3) FROM DUAL; 返回結(jié)果 2 。
|
|
LTRIM(<c1>,<c2>) | 從 c1 前面開(kāi)始去掉出現(xiàn)在 c2 的中任何前導(dǎo)字符集。 |
SELECT LTRIM(‘Mississippi’,’Mis’) FROM DUAL; 返回結(jié)果’ppi’。 SELECT RTRIM(‘Mississippi’,’ip’) FROM DUAL; 返回結(jié)果’Mississ’。 |
|
RTRIM(<c1>,<c2>) | 從 c1 后面開(kāi)始去掉出現(xiàn)在 c2 的中任何前導(dǎo)字符集。 | ||
數(shù)學(xué)函數(shù) | ABS(<n>) | 返回 n 的絕對(duì)值 | SELECT ABC(-2),ABS(2) FROM DUAL; |
ROUND(<n1>,<n2>) | 將 n1 的小數(shù)點(diǎn)后保留 n2 位(四舍五入)并返回。如果 n2 小于零, n1 舍入到小數(shù)點(diǎn)左邊。 |
SELECT ROUND(12345.678,-2), ROUND(12345.678,2) ?FROM? DUAL; 分別返回結(jié)果: 12300 , 12345.68 。
|
|
CEIL(<n>) | 將 n 向上取整,并返回。 |
SELECT CEIL(5.1),CEIL(-21.4) FROM? DUAL; 分別返回: 6, -21 。
|
|
FLOOR(<n>) | 將 n 向下取整,并返回。 |
SELECT FLOOR(5.1),FLOOR(-21.4) FROM? DUAL; 分別返回: 5, -22 。
|
|
MOD(<n1>,<n2>) | 返回 n1 模 n2 后的余數(shù)。 |
SELECT MOD(14,5),MOD(8,25),MOD(-64,7) FROM DUAL; 分別返回結(jié)果: 4 , 0.5 , -1 。
|
|
SIGN(<n>) |
符號(hào)函數(shù), n>0 ,返回 1 。 n<0 ,返回 -1 。 n=0 ,返回 0 。
|
SELECT SIGN(-2.3),SIGN(2.3),SIGN(0) FROM DUAL; | |
SQRT(<n>) | 返回 n 的平方根 | SELECT SQRT(9) FROM DUAL; | |
TRUNC(<n1>,<n2>) | 功能類似 ROUND 函數(shù)。但不做四舍五入。 |
SELECT TRUNC(123.456,2),TRUNC(123.456,-1) FROM DUAL; 分別返回結(jié)果: 123.45 、 120 。
|
|
VSIZE(n) | 返回?cái)?shù)字 n 的存儲(chǔ)字節(jié) | SELECT VSIZE(123) FROM DUAL; | |
日期函數(shù) ( 日期可以進(jìn)行算術(shù)運(yùn)算 ) | SYSDATE | 返回相同日期 | SELECT SYSDATE FROM DUAL; |
ADD_MONTHS(<d>,<i>) | 返回日期 d 加上 i 個(gè)月后的新日期 (i 正可負(fù) ) 。 |
SELECT SYSDATE, ADD_MONTHS(SYSDATE,2), ADD_MONTHS(SYSDATE,-2) FROM DUAL;
|
|
LAST_DAY(<d>) | 返回日期 d 所在的月的最后一天。 | SELECT SYSDATE,LAST_DAY(SYSDATE) FROM DUAL | |
MONTHS_BETWEEN(<d1>,<d2>) | 返回日期 d1 比 d2 大多少月數(shù)。 | SELECT MONTHS_BETWEEN(’19-Dec-1999’,’19-Mar-2000’ FROM DUAL; | |
NEW_TIME(<d>,<tz1>,<tz2>) | 將時(shí)區(qū) tz1 的時(shí)間 d ,轉(zhuǎn)換為時(shí)區(qū) tz2 里的時(shí)間。 | SELECT SYSDATE,NEW_TIME(SYSDATE,’CDT’,’PDT’) FROM DUAL; | |
NEXT_DAY(<d>,<dow>) | 返回日期 d 后的第一個(gè) dow 。 (dow : day of week) | SELECT NEXT_DAY(SYSDATE,’Monday’) FROM DUAL; | |
常用轉(zhuǎn)換函數(shù) | TO_CHAR(<x>[,<fmt>[,<nlsparm>]]) | 將 x 轉(zhuǎn)換成字符串。(參數(shù)含義請(qǐng)看 ORACLE 的聯(lián)機(jī)幫助) | SELECT TO_CHAR(SYSDATE,’YYYY-MM-DD’) FROM DUAL; |
TO_NUMBER(<c>[,<fmt>[,<nlsparm>]]) | 將字符串 c 轉(zhuǎn)換成數(shù)字。(參數(shù)含義請(qǐng)看 ORACLE 的聯(lián)機(jī)幫助) | SELECT TO_NUMBER(‘123’) FROM DUAL; | |
TO_DATE(<c>[,<fmt>[,<nlsparm>]]) ( 常見(jiàn)的日期格式請(qǐng)查聯(lián)機(jī)幫助。 ) |
將字符串 c 轉(zhuǎn)換成日期。 | SELECT TO_DATE(’19-Mar-99’,’DD-Mon-YYYY’) FROM DUAL; | |
兩個(gè)重要函數(shù) |
DECODE(<x>,<m1>,<r1>[,<m2>, <r2…>][,<d>]) (DECODE 函數(shù)功能非常強(qiáng)大,請(qǐng)仔細(xì)玩味。 )
|
一個(gè)功能非常強(qiáng)大的函數(shù),它使得 SQL 非常高效。它的功能類似于一系列的 if…then…else 語(yǔ)句。 |
SELECT sid,serial#,username, DECODE(command ,0,’None’ ,2,’Insert’ ,3,’Select’ ,6,’Update’ ,7,’Delete’ ,8,’Drop ,’Other’) cmd FROM V$SESSION WHERE type<>’BACKGROUND’;
|
NVL(x1,x2) 注意 ORACLE 中的 NULL 值,注意該函數(shù)作用
|
如果 x1 為空返回 x2 ,否則返回 x1 。 | SELECT NVL(ename,’ 無(wú)姓名 ’)? FROM? EMP; | |
分組函數(shù) |
|||
AVG([{DISTINCT|ALL}]<n>) | 求返回行的指定列的平均值 |
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM SCOTT.EMP;
|
|
COUNT({*|[DISTINCT|ALL]}<x>) | 統(tǒng)計(jì)返回的行數(shù) |
SELECT COUNT (*), COUNT(DISTINCT mgr),COUNT(mgr) FROM SCOTT.EMP
|
|
MAX([{DISTINCT|ALL}]<x>) | 求返回行的指定列的最大值 | SELECT MAX(sal),MAX(DISTINCT sal) FROM EMP; | |
MIN([{DISTINCT|ALL}]<x>) | 求返回行的指定列的最小值 | SELECT MIN(sal),MIN(DISTINCT sal) FROM EMP; | |
STDDEV([{DISTINCT|ALL}]<x>) | 求返回行的指定列的標(biāo)準(zhǔn)方差 | SELECT STDDEV(sal),STDDEV(DISTINCT sal) FROM EMP; | |
SUM() | 求返回行的指定列的和 | SELECT SUM(sal) FROM EMP; | |
VARIANCE() | 求返回行的指定列的差異值 |
注意:
A、 分組函數(shù)不會(huì)處理空值,也不會(huì)返回空值;
B、? 所有的分組函數(shù)既可以作用于指定列的所有值上,也可以只作用于指定列的差異列值上;
?? C、當(dāng)指定ALL選項(xiàng)時(shí),分組函數(shù)作用于所有非空列值行上。當(dāng)指定DISTINCT選項(xiàng)時(shí),分組函數(shù)只作用于非空的且具有不同列值的行上(即,重復(fù)列值的行只計(jì)算一行)。