|
|
|
|
SQL 函數是用來處理一個資料項,並傳回結果的運算。函數可以接受零個或多個參數,利用不同參數的函數完成不同的運算,並產生一個或多個結果。
ORACLE 系統中,除了前面介紹的資料型態轉換函數外,還有其他的函數,由於函數種類很多,在此作者只介紹比較常用的函數。
|
通常根據函數值的資料型態可將函數劃分為三類:
|
|
如果根據函數傳回的查詢結果之資料列數來區分,可將函數分成兩類:
|
|
單一記錄函數 |
|
群組函數 |
|
單一記錄函數和群組函數的根本區別在於記錄數目上的不同。單一記錄函數傳回查詢的表格或視觀表格中的一列。
1.
數值函數
數值函數接受數值輸入,傳回數值。
|
常用的數值函數如下: |
函 數 |
說 明 |
ABS(n) |
傳回 n 的絕對值。 |
CEIL(n) |
傳回大於或等於 n
的最小整數。 |
FLOOR(n) |
傳回等於或小於 n
的最大整數。 |
MOD(m,n) |
傳回 m 除以 n
的餘數,如果 n=0,則傳回 m。 |
POWER(m,n) |
傳回 m 的 n 次方,如果
m 為負數,則 n 必須是整數。 |
ROUND(n[,m]) |
傳回將 n
四捨五入到小數點右邊 m 位的值。當 m 忽略時,四捨五入到個位。當 m 為負數,四捨五入到小數點左邊第 m 位。 |
SIGN(n) |
當 n<0,傳回 -1;當
n=0 傳回 0;當 n>0,傳回 1。 |
SQRT(n) |
傳回 n 的平方根,n
不能為負數。 |
TRUNC(n[,m]) |
傳回在 m 位無條件捨去的 n
值,當 m 忽略,在 0 位無條件捨去;m 為負數,將小數點左邊第 m 位無條件捨去。 |
|
|
2. 字元函數
字元函數接受字元輸入,可傳回字元或數值。常用的字元函數如下:
|
函 數 |
說 明 |
CHR(n) |
傳回字元,其 ASCII
碼等於 n。 |
CONCAT(s1, s2) |
傳回 s1 字串連接 s2
字串的新字串。 |
INITCAP(s) |
將字串 s
的第一個字母為大寫,其它的為小寫。 |
LENGTH(s) |
傳回字串的長度。 |
LOWER(s) |
將所有字母為小寫。 |
LPAD(s1, n[,
s2]) |
用 s2 字元填入
s1字串中的左邊,使其總長度為 n。s2 的預設值為單個空格(‘ ’)。如果 s1 字串長度大於 n,函數則傳回 s1
字串的部分。n 為傳回值的總長度。 |
LTRIM(s [,set]) |
從 s 字串的左邊開始移去
set 字串中的字元,直至第一個不是 set 中的字元為止。set 的預設值為單個空格 (‘ ’)。 |
REPLACE(s, 搜尋字串
[,取代字串]) |
將用取代字串代替每一個搜尋字串的值,如果取代字串不寫,則所有搜尋字串的值被刪去。 |
RPAD(s1,
n[,s2]) |
用 s2
填入字串的右邊,使其總長度為 n。s2 字串的預設值為單個空格(‘ ’)。如果 s1 比 n 長,則傳回 s1 的部份。n
為傳回值的總長度。 |
RTRIM(s [,set]) |
從右邊開始移去 set
字串中的字元,直至最後一個不 set 中的字元為止。set 的預設值為單個空格 (‘ ’)。 |
SUBSTR ( s, m
[,n]) |
求 s 字串的子字串,從 m
處的字元開始,取 n 個字元長。 |
TRANSLATE (s,
fromS, toS) |
將 s 字串中的 fromS
字串中每一個字元值利用 toS 字串中相應字元替換。不在 fromS 字串中的 s 的字元則不進行轉換。 |
UPPER(s) |
傳回
s,其中所有字母為大寫,傳回值與引數 s 有相同資料型態。 |
DECODE(ex, s1,
r1 [, s2, r2,…], d) |
依照 ex
的值傳回不同的值,若 ex 的值為 s1 則傳回值 r1,[若 ex 的值為 s2 則傳回值 r2 …,]否則傳回值 d。
|
|
|
3. 日期函數
日期函數操作 DATE 資料型態的值,除
MONTHS_BETWEEN 外,其他所有的日期函數會傳回一個 DATE 型態的值。常用的日期函數如下表所示:
|
函 數 |
說 明 |
ADD_MONTHS(d,n) |
傳回加 n 個月的 d
日期,引數 n 為整數。如果 d 為該月中最後一天 (例如:31日),而且結果月份的總天數較少 (例如:二月的 28
日),則結果的日期為結果月份的最後一日 (例如:28 日),否則結果日期的天數與 d 中的原日期一致。 |
LAST_DAY(d) |
傳回包含 d
日期的月份最後一天之日期 |
MONTHS_BETWEEN(d1,d2) |
傳回日期 d1和 d2
之間的月數。如果 d1 比 d2 晚,結果為正;如果 d1 比 d2 早,則為負;如果 d1 與 d2 為同一日期,則結果為 0 |
NEXT_DAY(d,
星期幾) |
傳回比日期 d
晚的第一個星期幾。 |
ROUND(d[,fmt]) |
傳回依照指定的格式(fmt)
的單位將 d 四捨五入到最近日期。 |
TRUNC(d[,fmt]) |
傳回依照指定的格式(fmt)
的單位將 d 無條件捨去到最近的日期。 |
SYSDATE |
傳回當前的日期和時間。注意:CHECK 約束條件中不能使用該函數。 |
|
|
4.
虛值函數 NVL
在關聯式資料庫中,關聯表格中的值有時候會因相關資訊的不足或缺乏,使得無法在表格中特定欄位存入一個明確的值,因此會以一個虛值(NULL)
來代替其資料。虛值不是零,也非空白,用來記錄目前資料值未知的情況。虛值本身不能做任何比較與運算,因為結果都是虛值。
而以虛值的特性與意義,可大致分為以下三種:
|
(1) 可適用的虛值(Applicable Null
Values):
若是某特定欄位的值確實存在,但是我們並不知道其值為何,所以暫時存放一個虛值,等到日後得知確實數值後再填入。例如:我們對 JONES
的地址仍一無所知的話,我們可以存入一個「可適用的虛值」於其地址欄位中。 |
EMPNO |
ENAME |
ADDRESS |
1234 |
JOHN |
台南 |
1468 |
JONES |
NULL |
|
|
(2) 不可適用的虛值(Inapplicable Null
Values):
若是某特定欄位的值根本就不存在,則我們就可放入一個虛值,表示此欄位的值並不存在。例如:公司中有些員工,如銷售員有業績獎金(Comm)
制度,但是內勤的員工,如會計人員並沒有業績獎金制度,此時可將會計人員的業績獎金(Comm)
欄位存放「不可適用的虛值」,用以表示他根本沒有業績獎金制度。
|
EMPNO |
ENAME |
JOB |
COMM |
3838 |
SCOTT |
SALESMAN |
200 |
3849 |
FORD |
ACCOUNTANT |
NULL |
|
|
(3) 完全不知道的虛值(Totally Unknown):
若是某特定欄位的值,我們完全不知道這個值是否存在。例如:我們不知道 Mary
是否已結婚,因此用「完全不知道的虛值」來表示我們並不知道他的配偶是否存在。 |
EMPNO |
ENAME |
SPOUSE |
8088 |
FORD |
LINDA |
8092 |
MARY |
NULL |
|
虛值的查詢所使用的條件是 IS NULL,而非虛值為 IS NOT NULL。 |
|
查詢部門 30 中獎金(COMM)
不為 500 的員工資料。 |
|
|
|
|
5. 群組函數
(Aggregation functions) |
|
SQL 語言提供以下幾個群組函數 (e 為
NUMBER 型態運算式):
1. AVG(e):計算一組資料列 e 值的平均值。
2. COUNT(e):計算一組資料列中 e 值為非虛值(NOT NULL) 的列數。
3. COUNT(*):計算表格中的列數 (包括重複值和虛值)。
4. MAX(e):計算一組資料列中 e 值的最大值。
5. MIN(e):計算一組資料列中 e 值的最小值。
6. STDDEV(e):計算一組資料列中 e 值的標準差。
7. SUM(e):計算一組資料列中 e 值的總和。
8. VARIANCE(e):計算一組資料列中 e 值的變異數。
群組函數與單一記錄函數不同之處是:群組函數是傳回一個群組資訊而不是一條條單一記錄資訊,而且它對虛值的處理與單一記錄函數也完全不同。群組函數會忽略
NULL 值。所有的群組函數都適用於數值型資料,只有 MIN、MAX 和 COUNT 可用於任何資料型態。群組函數在呼叫時有兩種選項:ALL 和
DISTINCT。ALL 表示對一組資料列中所有運算式的值進行計算,這裡包括了運算式有重複值的情況。另一個選項 DISTINCT
表示僅對一組資料列中不同的運算式的值進行計算,即重複值不計算在內。預設的選項為 ALL,可以忽略不寫。 |
|