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

Oracle 資料庫常用單行函數與群組函數完整指南

     編輯:Oracle 資料庫基礎

Oracle 函數概述

在 Oracle 資料庫中,函數是接受零個或多個參數並返回單一值的程式單元。SQL 與 PL/SQL 內建了豐富的函數庫,主要分為兩大類:單行函數與群組函數(多行函數)。單行函數逐行操作資料,可用於 SELECT、WHERE、ORDER BY 等子句;群組函數則對多行資料彙總計算,常搭配 GROUP BY 使用。

單行函數詳細分類

1. 字元函數

用於處理字串資料,常見函數包括:

  • ASCII/CHR:字元與 ASCII 碼互轉
  • CONCAT/||:字串串聯,CONCAT 可處理 NULL 值
  • INITCAP:每個單字首字母大寫
  • INSTR/INSTRB:搜尋子字串位置,支援從右向左搜尋
  • LENGTH/LENGTHB:取得字串長度(字元/位元組)
  • LOWER/UPPER:大小寫轉換,常用於 WHERE 條件比對
  • LPAD/RPAD:左/右側填充字串至指定長度
  • LTRIM/RTRIM/TRIM:移除前導/尾隨/兩側特定字元
  • REPLACE:字串替換,支援 NULL 參數
  • SUBSTR/SUBSTRB:擷取子字串(字元/位元組為單位)
  • SOUNDEX:依發音相似度比對字串
  • TRANSLATE:字元級別的逐一替換

2. 數值函數

執行數學運算,所有三角函數參數均為弧度:

  • ABS/CEIL/FLOOR/ROUND/TRUNC:絕對值、捨入、截斷
  • POWER/SQRT/EXP/LN/LOG:冪、平方根、指數、對數
  • MOD:求餘數
  • SIGN:正負號判斷
  • SIN/COS/TAN 及雙曲函數:三角運算

3. 日期函數

操作 DATE 型別資料,多數返回 DATE 值:

  • SYSDATE:取得目前日期時間
  • ADD_MONTHS:日期加減月份
  • LAST_DAY:該月最後一天
  • MONTHS_BETWEEN:兩日期間月數差異
  • NEXT_DAY:指定週名之後的第一天
  • ROUND/TRUNC:日期捨入/截斷至指定單位
  • NEW_TIME:時區轉換

4. 轉換函數

資料型別間轉換:

  • TO_CHAR:數值/日期轉字串,支援格式模板與 NLS 參數
  • TO_DATE:字串轉日期
  • TO_NUMBER:字串轉數值
  • HEXTORAW/RAWTOHEX:16 進位與 RAW 互轉
  • ROWIDTOCHAR/CHARTOROWID:ROWID 與 CHAR 互轉

5. 其他單行函數

  • NVL/DECODE:NULL 處理與條件邏輯,NVL(x1,x2) 若 x1 為 NULL 則回傳 x2
  • GREATEST/LEAST:多值最大/最小值
  • USER/UID/USERENV:會話資訊
  • VSIZE/DUMP:內部表示位元組數與診斷資訊
  • BFILENAME/EMPTY_BLOB/EMPTY_CLOB:LOB 初始化

NULL 值與單行函數的關鍵行為

算術運算遇 NULL 結果為 NULL,多數函數亦同。例外函數:CONCAT、DECODE、DUMP、NVL、REPLACE 在引數為 NULL 時仍可回傳非 NULL。實務上常用 NVL(bonus,0) 避免薪資+獎金計算因 NULL 導致結果為 NULL。

群組函數(多行函數)

對多行資料彙總,回傳單一結果。常用於 SELECT 或 HAVING 子句,常搭配 GROUP BY:

  • AVG/COUNT/MAX/MIN/SUM:平均、計數、最大/最小、總和
  • STDDEV/VARIANCE:標準差與變異數
  • 支援 DISTINCT/ALL 修飾詞

GROUP BY 與 HAVING 進階應用

GROUP BY 依指定欄位分組,SELECT 清單中非彙總欄位必須出現在 GROUP BY 中。HAVING 用於過濾分組後的結果,彌補 WHERE 無法使用群組函數的限制。正確順序:WHERE → GROUP BY → HAVING → ORDER BY。

實務範例

-- 單行函數綜合應用
SELECT ename,
       TO_CHAR(hiredate, 'Day, DD-Mon-YYYY') AS hire_date,
       UPPER(ename) AS upper_name
FROM   emp
WHERE  UPPER(ename) LIKE 'AL%'
ORDER  BY SOUNDEX(ename);

-- 群組函數與 HAVING
SELECT sales_clerk, SUM(sale_amount) AS total_sales
FROM   gross_sales
WHERE  sales_dept = 'OUTSIDE'
GROUP  BY sales_clerk
HAVING SUM(sale_amount) > 10000
ORDER  BY total_sales DESC;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved