首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 內建函數完全參考手冊:單行函數與群組函數大全

     編輯:Oracle 資料庫基礎

函數分類總覽

類別特性適用子句
單行函數逐列運算,輸入一列回傳一值SELECT, WHERE, ORDER BY, SET, VALUES
群組函數多列聚合,輸入多列回傳單一值SELECT, HAVING (搭配 GROUP BY)

一、單行函數詳解

1. 字元函數

函數語法說明範例
ASCIIASCII(char)回傳首字元 ASCII 碼ASCII('A')=65
CHRCHR(n)ASCII 碼轉字元CHR(65)='A'
CONCATCONCAT(s1,s2)串接字串 (等同 ||)CONCAT('AB','C')='ABC'
INITCAPINITCAP(s)每字首字母大寫INITCAP('hello world')='Hello World'
INSTRINSTR(s, sub, [pos], [occ])尋找子字串位置INSTR('Mississippi','i',3,3)=11
LENGTHLENGTH(s)字串長度 (字元數)LENGTH('中文')=2
LENGTHBLENGTHB(s)字串長度 (位元組數)LENGTHB('中文')=6 (UTF8)
LOWER/UPPERLOWER(s)/UPPER(s)大小寫轉換UPPER('abc')='ABC'
LPAD/RPADLPAD(s,n,[pad])左/右填充至指定長度LPAD('5',3,'0')='005'
LTRIM/RTRIMLTRIM(s,[trim_set])移除左/右側指定字元LTRIM('xyxHELLO','xy')='HELLO'
REPLACEREPLACE(s, old, [new])替換子字串REPLACE('JACK','J','B')='BACK'
SUBSTRSUBSTR(s, pos, [len])擷取子字串SUBSTR('ABCDE',2,3)='BCD'
TRANSLATETRANSLATE(s, from, to)字元級對照替換TRANSLATE('123','12','AB')='AB3'
TRIMTRIM([BOTH|LEADING|TRAILING] c FROM s)標準修剪TRIM(' ABC ')='ABC'
SOUNDEXSOUNDEX(s)發音相似度編碼SOUNDEX('SMITH')=SOUNDEX('SMYTHE')

2. 數值函數

函數語法說明
ABSABS(n)絕對值
CEIL/FLOORCEIL(n)/FLOOR(n)向上/向下取整
ROUNDROUND(n, [precision])四捨五入 (precision 可負)
TRUNCTRUNC(n, [precision])截斷 (不四捨五入)
MODMOD(m,n)餘數
POWERPOWER(m,n)m 的 n 次方
SQRTSQRT(n)平方根
SIGNSIGN(n)正負號 (-1/0/1)
EXP/LN/LOGEXP(n), LN(n), LOG(base,n)指數/自然對數/指定底對數
三角函數SIN/COS/TAN/ASIN/ACOS/ATAN/SINH/COSH/TANH參數為弧度

3. 日期函數 (重點)

函數語法說明範例
SYSDATESYSDATE當前日期時間
ADD_MONTHSADD_MONTHS(d, n)加減月份ADD_MONTHS(SYSDATE, 3)
LAST_DAYLAST_DAY(d)該月最後一天LAST_DAY('2023-02-10')='2023-02-28'
MONTHS_BETWEENMONTHS_BETWEEN(d1, d2)兩日期月差MONTHS_BETWEEN('2023-12-31','2023-01-01')=11.97
NEXT_DAYNEXT_DAY(d, weekday)下一個指定週幾NEXT_DAY(SYSDATE, 'FRIDAY')
ROUNDROUND(d, [fmt])日期捨入 (fmt: YEAR/MONTH/DD/DY...)ROUND(SYSDATE, 'MONTH')=月初
TRUNCTRUNC(d, [fmt])日期截斷TRUNC(SYSDATE, 'DD')=今天 00:00:00
NEW_TIMENEW_TIME(d, tz1, tz2)時區轉換 (已棄用,用 FROM_TZ)

TO_CHAR 日期格式化元素速查

元素意義範例
YYYY4 位年份2023
MM月份 (01-12)07
MON / MONTH月份縮寫/全名JUL / JULY
DD月份中的第幾天15
DAY / DY星期全名/縮寫MONDAY / MON
HH24 / HH / HH1224/12 小時制14 / 02
MI分鐘30
SS秒45
AM / PM上午/下午標記PM
WW / IW年間第幾週 / ISO 週28
Q季度3
RM羅馬數字月份VII

4. 轉換函數

函數語法說明
TO_CHARTO_CHAR(n|d, [fmt], [nls])數值/日期 → 字串
TO_NUMBERTO_NUMBER(s, [fmt], [nls])字串 → 數值
TO_DATETO_DATE(s, [fmt], [nls])字串 → 日期
CASTCAST(expr AS type)ANSI 標準轉換
HEXTORAW/RAWTOHEXHEXTORAW(s)/RAWTOHEX(r)16 進位 ↔ RAW
CHARTOROWID/ROWIDTOCHARCHARTOROWID(s)/ROWIDTOCHAR(r)ROWID ↔ CHAR
TO_MULTI_BYTE/TO_SINGLE_BYTETO_MULTI_BYTE(s)/TO_SINGLE_BYTE(s)單/多位元組字元轉換
CONVERTCONVERT(s, dest_charset, [src_charset])字符集轉換

5. 通用/條件/系統函數

函數語法說明
NVLNVL(expr1, expr2)expr1 為 NULL 回傳 expr2
NVL2NVL2(expr1, expr2, expr3)expr1 不為 NULL 回傳 expr2 否則 expr3
COALESCECOALESCE(expr1, expr2, ...)回傳第一個非 NULL (ANSI)
NULLIFNULLIF(expr1, expr2)相等回傳 NULL 否則 expr1
DECODEDECODE(expr, search, result, [search, result...], [default])Oracle 專用 CASE 簡寫
CASECASE WHEN cond THEN result ... [ELSE result] ENDANSI 標準條件
GREATEST/LEASTGREATEST(expr...)/LEAST(expr...)最大/最小值
DUMPDUMP(expr, [fmt], [start], [len])內部表示資訊
VSIZEVSIZE(expr)內部儲存位元組數
USER/UIDUSER / UID當前用戶名/ID
USERENVUSERENV(parameter)Session 資訊 (語言、終端、Instance 等)
SYS_CONTEXTSYS_CONTEXT(namespace, parameter)增強版環境資訊
EMPTY_BLOB/CLOBEMPTY_BLOB() / EMPTY_CLOB()初始化 LOB 定位器
BFILENAMEBFILENAME(dir, file)建立 BFILE 定位器

二、群組函數 (聚合函數)

函數語法說明
AVGAVG([DISTINCT|ALL] expr)平均值
COUNTCOUNT({*|DISTINCT|ALL} expr)計數 (* 含 NULL)
MAX/MINMAX(expr)/MIN(expr)最大/最小值
SUMSUM([DISTINCT|ALL] expr)總和
STDDEVSTDDEV([DISTINCT|ALL] expr)標準差
VARIANCEVARIANCE([DISTINCT|ALL] expr)變異數
MEDIANMEDIAN(expr)中位數 (10g+)
STATS_MODESTATS_MODE(expr)眾數 (10g+)

GROUP BY 與 HAVING 核心規則

  1. SELECT 清單中非聚合欄位必須出現在 GROUP BY
  2. WHERE 不能使用群組函數,必須用 HAVING
  3. HAVING 過濾分組後結果,WHERE 過濾分組前列

範例

-- 正確:HAVING 過濾群組
SELECT dept_id, AVG(salary) AS avg_sal
FROM employees
WHERE hire_date > DATE '2020-01-01'  -- 列級過濾
GROUP BY dept_id
HAVING AVG(salary) > 5000            -- 群組級過濾
ORDER BY avg_sal DESC;

-- 巢狀函數:單行函數在群組函數中
SELECT dept_id, 
       COUNT(DISTINCT UPPER(job_id)) AS job_types,
       ROUND(AVG(NVL(commission_pct, 0)), 4) AS avg_comm
FROM employees
GROUP BY dept_id;

三、實用組合技巧

  1. 日期運算:TRUNC(SYSDATE) - 7 (一週前)、ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) (上月第一天)
  2. 分頁查詢:ROW_NUMBER() OVER (ORDER BY id) (12c+ OFFSET ... FETCH)
  3. 字串聚合:LISTAGG(col, ',') WITHIN GROUP (ORDER BY col) (11g+)
  4. 正則表達式:REGEXP_SUBSTR/REGEXP_REPLACE/REGEXP_LIKE (10g+)
  5. JSON 處理:JSON_VALUE/JSON_QUERY/JSON_TABLE (12c+)

效能提示

  • 避免在 WHERE 條件欄位上使用函數 (導致索引失效) → 改寫條件或建立函數索引
  • NVL / COALESCE 短路求值,參數順序影響效能
  • 大量資料聚合考慮 PARALLEL 提示
  • COUNT(*) vs COUNT(col):前者含 NULL,後者不含,執行計畫可能不同

結語:精通 Oracle 內建函數是寫出簡潔、高效 SQL 的關鍵。建議收藏本速查表,實戰中「查表確認語法」比「憑記憶試錯」快十倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved