Oracle函數
Oracle SQL提供了用於執行特定操作的專用函數,這些函數大大增強了SQL語言的功能。函數可以接受零個或者多個輸入參數,並返回一個輸出結果。Oracle數據庫中主要使用兩種類型的函數:
- 單行函數:對每一個函數應用在表的記錄中時,只能輸入一行結果,返回一個結果,比如:MOD(x,y)返回x除以y的余數(x和y可以是兩個整數,也可以是表中的整數列)。常用的單行函數有:
- 字符函數:對字符串操作。
- 數字函數:對數字進行計算,返回一個數字。
- 轉換函數:可以將一種數據類型轉換為另外一種數據類型。
- 日期函數:對日期和時間進行處理。
- 聚合函數:聚合函數同時可以對多行數據進行操作,並返回一個結果。比如SUM(x)返回結果集中x列的總合。
目錄大綱
Oracle函數 1
² 字符函數 2
² 數字函數 3
² 日期函數 4
² 轉換函數 6
² 其他單行函數 8
² 聚合函數 9
² 字符函數
字符函數接受字符參數,這些參數可以是表中的列,也可以是一個字符串表達式。下表列出了常用的字符函數。
函數 |
說明 |
ASCII(x) |
返回字符x的ASCII碼。 |
CONCAT(x,y) |
連接字符串x和y。 |
INSTR(x, str. Start, n) |
在x中查找str,可以指定從start開始,也可以指定從第n次開始。 |
LENGTH(x) |
返回x的長度。 |
LOWER(x) |
x轉換為小寫。 |
UPPER(x) |
x轉換為大寫。 |
LTRIM(x,trim_str) |
把x的左邊截去trim_str字符串,缺省截去空格。 |
RTRIM(x,trim_str) |
把x的右邊截去trim_str字符串,缺省截去空格。 |
TRIM(trim_str FROM x) |
把x的兩邊截去trim_str字符串,缺省截去空格。 |
REPLACE(x,old,new) |
在x中查找old,並替換為new。 |
SUBSTR(x, start ,length) |
返回x的字串,從staart處開始,截取length個字符,缺省length,默認到結尾。 |
表1 字符函數
示例 |
示例結果 |
SELECT ASCII('a') FROM DUAL |
97 |
SELECT CONCAT('Hello', ' world') FROM DUAL |
Hello world |
SELECT INSTR('Hello world','or') FROM DUAL |
8 |
SELECT LENGTH('Hello') FROM DUAL |
5 |
SELECT LOWER('hElLO') FROM DUAL; |
hello |
SELECT UPPER('hello') FROM DUAL |
HELLO |
SELECT LTRIM('===HELLO===', '=') FROM DUAL |
HELLO=== |
SELECT '=='||LTRIM(' HELLO===') FROM DUAL |
==HELLO=== |
SELECT RTRIM('===HELLO===', '=') FROM DUAL |
===HELLO |
SELECT '='||TRIM(' HELLO ')||'=' FROM DUAL |
=HELLO= |
SELECT TRIM('=' FROM '===HELLO===') FROM DUAL |
HELLO |
SELECT REPLACE('ABCDE','CD','AAA') FROM DUAL |
ABAAAE |
SELECT SUBSTR('ABCDE',2) FROM DUAL |
BCDE |
SELECT SUBSTR('ABCDE',2,3) FROM DUAL |
BCD |
表2 字符函數示例
² 數字函數
數字函數接受數字參數,參數可以來自表中的一列,也可以是一個數字表達式。
函數 |
說明 |
示例 |
ABS(x) |
x絕對值 |
ABS(-3)=3 |
ACOS(x) |
x的反余弦 |
ACOS(1)=0 |
COS(x) |
余弦 |
COS(1)=1.57079633 |
CEIL(x) |
大於或等於x的最小整數 |
CEIL(5.4)=6 |
FLOOR(x) |
小於或等於x的最大整數 |
FLOOR(5.8)=5 |
LOG(x,y) |
x為底y的對數 |
LOG(2,4)=2 |
MOD(x,y) |
x除以y的余數 |
MOD(8,3)=2 |
POWER(x,y) |
x的y次冪 |
POWER(2,3)=8 |
ROUND(x,y) |
x在第y小數位四舍五入 |
ROUND(3.456,2)=3.46 |
SQRT(x) |
x的平方根 |
SQRT(4)=2 |
TRUNC(x,y) |
x在第y位截斷 |
TRUNC(3.456,2)=3.45 |
表3 數字函數
說明:
- ROUND(X[,Y]),四舍五入。
在缺省y時,默認y=0;比如:ROUND(3.56)=4。
y是正整數,就是四舍五入到小數點后y位。ROUND(5.654,2)=5.65。
y是負整數,四舍五入到小數點左邊|y|位。ROUND(351.654,-2)=400。
- TRUNC(x[,y]),直接截取,不四舍五入。
在缺省y時,默認y=0;比如:TRUNC (3.56)=3。
y是正整數,就是四舍五入到小數點后y位。TRUNC (5.654,2)=5.65。
y是負整數,四舍五入到小數點左邊|y|位。TRUNC (351.654,-2)=300。
² 日期函數
日期函數對日期進行運算。常用的日期函數有:
- ADD_MONTHS(d,n),在某一個日期d上,加上指定的月數n,返回計算后的新日期。d表示日期,n表示要加的月數。
圖1 ADD_MONTHS函數示
- LAST_DAY(d),返回指定日期當月的最后一天。
圖2 LAST_DAY函數示例
- ROUND(d[,fmt]),返回一個以fmt為格式的四舍五入日期值,d是日期,fmt是格式模型。默認fmt為DDD,即月中的某一天。
- 如果fmt為“YEAR”則舍入到某年的1月1日,即前半年舍去,后半年作為下一年。
- 如果fmt為“MONTH”則舍入到某月的1日,即前月舍去,后半月作為下一月。
- 默認為“DDD”,即月中的某一天,最靠近的天,前半天舍去,后半天作為第二天。
- 如果fmt為“DAY”則舍入到最近的周的周日,即上半周舍去,下半周作為下一周周日。
圖3 ROUND函數示例
與ROUND對應的函數時TRUNC(d[,fmt])對日期的操作,TRUNC與ROUND非常相似,只是不對日期進行舍入,直接截取到對應格式的第一天。
- EXTRACT(fmt FROM d),提取日期中的特定部分。
fmt為:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。其中YEAR、MONTH、DAY可以為DATE類型匹配,也可以與TIMESTAMP類型匹配;但是HOUR、MINUTE、SECOND必須與TIMESTAMP類型匹配。
HOUR匹配的結果中沒有加上時區,因此在中國運行的結果小8小時。
圖4 EXTRACT函數示例
² 轉換函數
轉換函數將值從一種數據類型轉換為另外一種數據類型。常用的轉換函數有:
- TO_CHAR(d|n[,fmt])
把日期和數字轉換為制定格式的字符串。fmt是格式化字符串,日期的格式化字符串前面已經學習過。
代碼演示:TO_CHAR對日期的處理
SQL> SELECT TO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS') "date" ① 2 FROM DUAL;
date ----------------------- 2009年08月11日 12:06:00 |
代碼解析:
① 在格式化字符串中,使用雙引號對非格式化字符進行引用。
針對數字的格式化,格式化字符有:
參數 |
示例 |
說明 |
9 |
999 |
指定位置處顯示數字。 |
. |
9.9 |
指定位置返回小數點 |
, |
99,99 |
指定位置返回一個逗號 |
$ |
$999 |
數字開頭返回一個美元符號 |
EEEE |
9.99EEEE |
科學計數法表示 |
L |
L999 |
數字前加一個本地貨幣符號 |
PR |
999PR |
如果數字式負數則用尖括號進行表示 |
表4 數字格式化字符
代碼演示:TO_CHAR對數字的處理
SQL> SELECT TO_CHAR(-123123.45,'L9.9EEEEPR') "date" 2 FROM DUAL 3 / date -------------------- <¥1.2E+05> |
- TO_DATE(x [,fmt])
把一個字符串以fmt格式轉換為一個日期類型,前面已經學習過。
- TO_NUMBER(x[,fmt])
把一個字符串以fmt格式轉換為一個數字。fmt格式字符參考表3。
代碼演示:TO_NUM函數
SQL> SELECT TO_NUMBER('-$12,345.67','$99,999.99') "NUM" 2 FROM DUAL 3 /
NUM --------------- -12345.67 |
² 其他單行函數
- NVL(x,value)
如果x為空,返回value,否則返回x。
案例7:對工資是2000元以下的員工,如果沒有發獎金,每人獎金100元。
代碼演示:NVL函數
SQL> SELECT ENAME,JOB,SAL,NVL(COMM,100) FROM EMP WHERE SAL<2000;
7 rows selected |
- NVL2(x,value1,value2)
如果x非空,返回value1,否則返回value2。
案例8:對EMP表中工資為2000元以下的員工,如果沒有獎金,則獎金為200元,如果有獎金,則在原來的獎金基礎上加100元。
代碼演示:NVL2函數
SQL> SELECT ENAME,JOB,SAL,NVL2(COMM,comm+100,200) "comm" 2 FROM EMP WHERE SAL<2000;
8 rows selected |
² 聚合函數
聚合函數同時對一組數據進行操作,返回一行結果,比如計算一組數據的總和,平均值等。
名稱 |
作用 |
語法 |
AVG |
平均值 |
AVG(表達式) |
SUM |
求和 |
SUM(表達式) |
MIN、MAX |
最小值、最大值 |
MIN(表達式)、MAX(表達式) |
COUNT |
數據統計 |
COUNT(表達式) |
表 5 聚合函數
案例9:求本月所有員工的基本工資總和。
代碼演示:SUM函數
SQL> select sum(sal) from emp; SUM(SAL) ---------------- 29025 |
案例10:求不同部門的平均工資。
代碼演示:AVG函數下的分組查詢
SQL> SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO;
DEPTNO AVG(SAL) --------- ---------- 30 1566.66666 20 2175 10 2916.66666 |