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

Oracle 110+ 內建函數完全分類速查手冊 (含範例與分析函數詳解)

     編輯:Oracle 資料庫基礎

前言

Oracle 提供豐富的內建函數涵蓋字串、數值、日期、轉換、彙總、分析/視窗等類別。本文將 110+ 常用函數依功能分類整理,附帶語法、範例與實務提示,適合開發者與 DBA 快速查閱。 (原文函數編號 100-110 為重複,已去重合併。)

一、字串函數

函數說明範例結果
ASCII(c)回傳字元的 ASCII/Unicode 碼點ASCII('A')65
CHR(n)回傳碼點對應字元CHR(65)'A'
CONCAT(s1,s2) / s1||s2字串串聯CONCAT('AB','CD')'ABCD'
INITCAP(s)首字大寫,其餘小寫INITCAP('hello world')'Hello World'
INSTR(s, sub, pos, occ)搜尋子字串位置 (支援起始位置、第 N 次出現)INSTR('Oracle Training','ra',1,2)9
LENGTH(s) / LENGTHB(s)字元長度 / 位元組長度LENGTH('中文')2
LOWER(s) / UPPER(s)大小寫轉換UPPER('abc')'ABC'
LPAD(s, n, pad) / RPAD(s, n, pad)左/右填充至指定長度LPAD('GAO',10,'*')'*******GAO'
LTRIM(s, chars) / RTRIM(s, chars)移除左/右側指定字元 (預設空白)LTRIM(' GAO')'GAO'
SUBSTR(s, pos, len) / SUBSTRB擷取子字串 (位元組語意)SUBSTR('13088888888',3,8)'08888888'
REPLACE(s, old, new)字串替換REPLACE('he love you','he','I')'I love you'
SOUNDEX(s)回傳發音代碼 (英文姓名模糊比對)SOUNDEX('Smith')'S530'
TRIM([LEADING|TRAILING|BOTH] c FROM s)標準 SQL 去除首尾字元TRIM(' ' FROM ' AB ')'AB'
TRANSLATE(s, from, to)字元級對應替換 (一對一)TRANSLATE('abc','abc','123')'123'

二、數值函數

函數說明範例結果
ABS(n)絕對值ABS(-100)100
ACOS/ASIN/ATAN(n)反三角函數 (弧度)ACOS(-1)3.14159...
CEIL(n) / FLOOR(n)天花板/地板 (無條件進位/捨去)CEIL(3.14)4
COS/SIN/TAN(n)三角函數 (弧度)COS(3.14159)-1
COSH/SINH/TANH(n)雙曲線函數COSH(1)1.543
EXP(n)e 的 n 次方EXP(1)2.71828
LN(n) / LOG(b, n)自然對數 / 指定底對數LOG(2,8)3
MOD(m, n)餘數 (m - n*FLOOR(m/n))MOD(10,3)1
POWER(m, n)m 的 n 次方POWER(2,10)1024
ROUND(n, dec) / TRUNC(n, dec)四捨五入 / 截斷 (dec 可負數)ROUND(55.5), TRUNC(55.5)56, 55
SIGN(n)正負號 (1, -1, 0)SIGN(-5)-1
SQRT(n)平方根SQRT(64)8
WIDTH_BUCKET(val, min, max, buckets)等寬分桶編號 (1~buckets)WIDTH_BUCKET(75,0,100,10)8

三、日期時間函數

函數說明範例結果
SYSDATE / SYSTIMESTAMP資料庫伺服器當前日期/時間戳SYSDATE2024-05-20 14:30:00
CURRENT_DATE / CURRENT_TIMESTAMPSession 時區當前日期/時間戳CURRENT_TIMESTAMP2024-05-20 14:30:00.123 +08:00
ADD_MONTHS(d, n)加減月份 (自動處理月末)ADD_MONTHS(DATE'2024-01-31',1)2024-02-29
LAST_DAY(d)該月最後一天LAST_DAY(SYSDATE)2024-05-31
MONTHS_BETWEEN(d1, d2)兩日期月份差 (含小數)MONTHS_BETWEEN(DATE'2024-12-31',DATE'2024-01-01')11.97
NEXT_DAY(d, '星期X')指定星期之後的下一個日期NEXT_DAY(SYSDATE,'FRIDAY')2024-05-24
NEW_TIME(d, tz1, tz2)時區轉換 (舊函數,建議用 FROM_TZ/AT TIME ZONE)NEW_TIME(SYSDATE,'PST','EST')...
ROUND(d, fmt) / TRUNC(d, fmt)日期捨入/截斷 (fmt: YEAR, MONTH, DAY, HH, MI...)TRUNC(SYSDATE,'MONTH')2024-05-01 00:00:00
EXTRACT(field FROM d)擷取日期欄位 (YEAR, MONTH, DAY, HOUR...)EXTRACT(MONTH FROM SYSDATE)5
TO_CHAR(d, fmt) / TO_DATE(s, fmt)日期↔字串轉換 (格式模板)TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')'2024-05-20 14:30:00'
TO_TIMESTAMP / TO_TIMESTAMP_TZ字串轉 Timestamp / Timestamp with TZTO_TIMESTAMP('2024-05-20 14:30','YYYY-MM-DD HH24:MI')...
INTERVAL 'n' UNIT間隔常值 (支援運算)SYSDATE + INTERVAL '7' DAY一週後

四、轉換與條件函數

函數說明範例
TO_NUMBER(s, fmt)字串轉數值TO_NUMBER('$1,234.56','$9,999.99')
TO_CHAR(n, fmt)數值轉格式化字串TO_CHAR(1234.5,'FM$9,999.00')
NVL(expr1, expr2)expr1 為 NULL 回傳 expr2NVL(comm, 0)
NVL2(expr1, expr2, expr3)expr1 不為 NULL 回傳 expr2,否則 expr3NVL2(comm, '有獎金', '無獎金')
NULLIF(expr1, expr2)相等回傳 NULL,否則 expr1NULLIF(len, 0)
COALESCE(e1, e2, ...)回傳第一個非 NULL 參數 (ANSI 標準)COALESCE(comm, sal, 0)
CASE WHEN ... THEN ... ELSE ... END標準條件表達式 (可嵌套)CASE WHEN sal>5000 THEN '高' ELSE '普' END
DECODE(expr, s1, r1, s2, r2, ..., def)Oracle 專用條件 (等值比較)DECODE(deptno,10,'A',20,'B','其他')

五、彙總與分組函數

  • AVG, SUM, COUNT, MAX, MIN - 基礎彙總
  • STDDEV, STDDEV_POP, STDDEV_SAMP - 標準差 (總體/樣本)
  • VARIANCE, VAR_POP, VAR_SAMP - 變異數
  • MEDIAN - 中位數 (10g+)
  • STATS_MODE - 眾數 (10g+)
  • GROUPING / GROUPING_ID - 識別 GROUP BY ROLLUP/CUBE 產生的彙總列
  • LISTAGG(expr, delimiter) WITHIN GROUP (ORDER BY ...) - 字串彙總 (11g+),如 `LISTAGG(ename,',') WITHIN GROUP (ORDER BY ename)` → `'ALLEN,BLAKE,CLARK...'`

六、分析/視窗函數 (Analytic/Window Functions) - 核心進階功能

語法:FUNCTION(...) OVER (PARTITION BY ... ORDER BY ... [WINDOWING_CLAUSE])。
不減少回傳列數,每列都可見群組內彙總/排序結果。

函數說明關鍵特性
ROW_NUMBER()分組內唯一遞增序號 (1,2,3...)無並列,可用於分頁、去重
RANK()排名,並列同名次,後續跳號 (1,2,2,4)適合排名報表
DENSE_RANK()密集排名,並列同名次,不跳號 (1,2,2,3)適合連續等級
LAG(expr, offset, def)取得前一列 (或指定偏移) 的值避免 Self-Join,計算環比
LEAD(expr, offset, def)取得後一列的值計算同比、預測
FIRST_VALUE(expr)視窗內第一列的值基準比較
LAST_VALUE(expr)視窗內最後一列的值 (需加窗口子句)結尾基準
NTILE(n)分組資料等分為 n 個桶,回傳桶號四分位數、十分位數
CUME_DIST()累積分布 (≤ 當前值的比例)0<值≤1
PERCENT_RANK()相對排名 (排名-1)/(總數-1)0~1 之間
PERCENTILE_CONT(p)連續百分位數 (插值計算)中位數 p=0.5
PERCENTILE_DISC(p)離散百分位數 (取實際資料值)實際存在的值
AVG/SUM/MAX/MIN/COUNT OVER (...)視窗彙總 (移動平均、累加和...)ROWS/RANGE 子句控制視窗範圍
CORR/COVAR_POP/COVAR_SAMP OVER (...)視窗相關係數/協方差統計分析
REGR_SLOPE/INTERCEPT/COUNT/R2/AVGX/AVGY/SXX/SYY/SXY OVER (...)線性回歸統計視窗函數趨勢分析
STDDEV_POP/SAMP, VAR_POP/SAMP OVER (...)視窗標準差/變異數波動度監控

視窗子句 (Windowing Clause) 關鍵語法

OVER (
  PARTITION BY deptno           -- 分組
  ORDER BY sal                  -- 排序 (決定視窗起訖)
  ROWS BETWEEN 3 PRECEDING AND CURRENT ROW   -- 實體列數視窗
  RANGE BETWEEN 100 PRECEDING AND 100 FOLLOWING -- 數值範圍視窗
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -- 全分組
)

實戰範例:移動平均與同比

SELECT deptno, ename, sal,
       AVG(sal) OVER (PARTITION BY deptno ORDER BY hiredate
                      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS mov_avg_3,
       LAG(sal) OVER (PARTITION BY deptno ORDER BY hiredate) AS prev_sal,
       sal - LAG(sal) OVER (PARTITION BY deptno ORDER BY hiredate) AS diff_prev
FROM emp;

七、其他實用函數

  • USER / UID - 當前用戶名/ID
  • USERENV('SESSIONID'/'LANGUAGE'/'TERMINAL'/'ISDBA'...) - 會話環境資訊 (12c+ 建議用 `SYS_CONTEXT('USERENV',...)`)
  • DUMP(expr, fmt, start, len) - 內部儲存結構診斷
  • EMPTY_BLOB() / EMPTY_CLOB() - LOB 初始化
  • BFILENAME(dir, file) - 外部二進位檔案定位器
  • HEXTORAW / RAWTOHEX - 十六進位↔原始二進位
  • CHARTOROWID / ROWIDTOCHAR - ROWID 轉換
  • GREATEST / LEAST - 多參數最大/最小值 (字串比較依編碼)
  • VSIZE(expr) - 內部儲存位元組數

使用建議與效能提示

  1. 索引友善: `WHERE UPPER(name) = 'ABC'` 無法使用 `name` 索引 → 改用 `WHERE name = 'ABC'` (資料庫大小寫不敏感設定) 或建立函數索引 `CREATE INDEX idx_upper_name ON t(UPPER(name))`。
  2. 隱式轉換陷阱: `WHERE date_col = '2024-01-01'` 依賴 `NLS_DATE_FORMAT` → **永遠用 `TO_DATE` 或 `DATE'2024-01-01'` 常值**。
  3. 分析函數 vs GROUP BY: 需同時顯示明細與彙總 → 分析函數;僅需彙總 → `GROUP BY` 效能更好。
  4. 視窗框架預設: `ORDER BY` 存在時預設 `RANGE UNBOUNDED PRECEDING AND CURRENT ROW` (累加);無 `ORDER BY` 時為全分組。明確指定 `ROWS/RANGE` 避免誤解。
  5. 大量資料排序: 分析函數需排序,大表建議先 `WHERE` 過濾或使用物化視圖預計算。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved