4-1 資料庫共通的語言-SQL

4-2 SQL 的歷史

4-3 SQL 的基本語言

4-4 SQL 物件(SQL Object)

4-5 資料型態

4-6 資料型態轉換

4-7 基本表格(BASED TABLE)

4-8 虛擬欄位和虛擬表格

4-9 資料型態轉換函數

4-10 SQL 中常用的函數

4-11 SELECT 指令小結

4-12 視觀表格(VIEW)

4-13 基本表格、視觀表格的拷貝

 

 

   

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,可以忽略不寫。