Oracle已經內建了許多函數,不同的函數有不同的作用和用法,有的函數只能作用在一個記錄行上,有的能夠作用在多個記錄行上,不同的函數可能處理不同的數據類型。常見的有兩類,單行函數和分組函數 。
單行函數:
單行函數
分類 函數 功能 示例
字符函數 LPAD(<c1>,<i>[,<c2>]) 在字符串c1的左邊添加字符串c2直到c1字符串的長度等於i。 SELECT LPAD('Hello!',8,' ') leftpad,RPAD('Hello!',8,' ') rightpad
FROM DUAL;
RPAD(<c1>,<i>[,<c2>]) 在字符串c1的右邊添加字符串c2直到c1字符串的長度等於i。
LOWER(<c1>) 把字符串c1轉換為小寫 SELECT LOWER(ename) one,UPPER(ename) two, INITCAP(ename) FROM EMP;
UPPER(<c1>) 把字符串c1轉換為大寫
INITCAP(<c1>) 把c1字符串的每一個單詞的第一個字母轉換成大寫字母
LENGTH(<c1>) 返回字符串c1的長度 SELECT LENGTH('How are you') FROM DUAL;
SUBSTR(<c1>,<i>[,<j>]) 返回字符串c1中從第i個位置開始的j個字符(向右)。如果省略j,則返回c1中從第i個位置開始的所有字符。如果j為負,則返回字符串c1中從第i個位置開始的j個字符(向左)。 SELECT SUBSTR('Hello,World',1,5) FROM DUAL;
INSTR(<c1>,<c2>[,<i>[,<j>]]) 在c1中從位置i開始查找c2在c1中出第j次的位置,i可以為負(此時,從c1的尾部開始)。 SELECT INSTR('Mississippi','i',3,3) FROM DUAL; 返回結果11。
SELECT INSTR('Mississippi','i',-2,3) FROM DUAL; 返回結果2。
LTRIM(<c1>,<c2>) 從c1前面開始去掉出現在c2的中任何前導字符集。 SELECT LTRIM('Mississippi','Mis') FROM DUAL; 返回結果'ppi'。
SELECT RTRIM('Mississippi','ip') FROM DUAL; 返回結果'Mississ'。
RTRIM(<c1>,<c2>) 從c1後面開始去掉出現在c2的中任何前導字符集。
數學函數 ABS(<n>) 返回n的絕對值 SELECT ABC(-2),ABS(2) FROM DUAL;
ROUND(<n1>,<n2>) 將n1的小數點後保留n2位(四捨五入)並返回。如果n2小於零,n1捨入到小數點左邊。 SELECT ROUND(12345.678,-2),
ROUND(12345.678,2)
FROM DUAL;
分別返回結果: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後的余數。 SELECT MOD(14,5),MOD(8,25),MOD(-64,7) FROM DUAL;
分別返回結果:4,0.5,-1。
SIGN(<n>) 符號函數,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函數。但不做四捨五入。 SELECT TRUNC(123.456,2),TRUNC(123.456,-1) FROM DUAL;
分別返回結果:123.45、120。
VSIZE(n) 返回數字n的存儲字節 SELECT VSIZE(123) FROM DUAL;
日期函數(日期可以進行算術運算) SYSDATE 返回相同日期 SELECT SYSDATE FROM DUAL;
ADD_MONTHS(<d>,<i>) 返回日期d 加上i個月後的新日期(i正可負)。 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大多少月數。 SELECT MONTHS_BETWEEN('19-Dec-1999','19-Mar-2000' FROM DUAL;
NEW_TIME(<d>,<tz1>,<tz2>) 將時區tz1的時間d,轉換為時區tz2裡的時間。 SELECT SYSDATE,NEW_TIME(SYSDATE,'CDT','PDT') FROM DUAL;
NEXT_DAY(<d>,<dow>) 返回日期d後的第一個dow。(dow:day of week) SELECT NEXT_DAY(SYSDATE,'Monday') FROM DUAL;
常用轉換函數 TO_CHAR(<x>[,<fmt>[,<nlsparm>]]) 將x轉換成字符串。(參數含義請看ORACLE的聯機幫助) SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM DUAL;
TO_NUMBER(<c>[,<fmt>[,<nlsparm>]]) 將字符串c轉換成數字。(參數含義請看ORACLE的聯機幫助) SELECT TO_NUMBER('123') FROM DUAL;
TO_DATE(<c>[,<fmt>[,<nlsparm>]])
TO_DATE(EFFECTDATE,'YYYY-MM-DD')
(常見的日期格式請查聯機幫助。)
將字符串c轉換成日期。 SELECT TO_DATE('19-Mar-99','DD-Mon-YYYY') FROM DUAL;
兩個重要函數 DECODE(<x>,<m1>,<r1>[,<m2>,
<r2…>][,<d>])
(DECODE函數功能非常強大,請仔細玩味。)
一個功能非常強大的函數,它使得SQL非常高效。它的功能類似於一系列的if…then…else語句。 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';
NVL2(expr1,expr2,expr3)
功能:如果參數表達式expr1值為NULL,則NVL2()函數返回參數表達式expr3的值;如果參數表達式expr1值不為NULL,則NVL2()函數返回參數表達式expr2的值。
NVL(x1,x2)
注意ORACLE中的NULL值,注意該函數作用
如果x1為空返回x2,否則返回x1。 SELECT NVL(ename,'無姓名') FROM EMP;
分組函數
AVG([{DISTINCT|ALL}]<n>) 求返回行的指定列的平均值 SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal)
FROM SCOTT.EMP;
COUNT({*|[DISTINCT|ALL]}<x>) 統計返回的行數 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>) 求返回行的指定列的標准方差 SELECT STDDEV(sal),STDDEV(DISTINCT sal) FROM EMP;
SUM() 求返回行的指定列的和 SELECT SUM(sal) FROM EMP;
VARIANCE() 求返回行的指定列的差異值