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

Oracle 分組函數深度解析:類型、執行順序與進階應用

     編輯:Oracle 資料庫基礎

分組函數與聚合函數:概念釐清

在 Oracle 文檔中,「分組函數」與「聚合函數」實為同義詞,指對一組資料列運算返回單一值的函數。本文系統整理其類型、查詢執行順序與實戰技巧。

SQL 查詢子句執行順序

理解執行順序是編寫正確分組查詢的關鍵:

  1. FROM / JOIN:確定資料來源
  2. WHERE:列級過濾,建立候選行集
  3. GROUP BY:依指定欄位分組
  4. 聚合函數計算:對各組執行 COUNT、SUM、AVG 等
  5. HAVING:組級過濾,移除不符合條件的分組
  6. SELECT:選取輸出欄位(含聚合結果)
  7. ORDER BY:結果排序(預設 GROUP BY 隱式升序,可用 DESC 覆蓋)

分組函數完整類型清單

函數功能適用資料型別備註
AVG平均值數值
COUNT計數所有三種寫法見下表
MAX最大值數值、字串、日期
MIN最小值數值、字串、日期
SUM合計數值
STDDEV標準差數值樣本標準差
VARIANCE變異數數值樣本變異數

COUNT 函數三種語法詳解

語法說明包含 NULL去重
COUNT(*)返回查詢結果總行數是否
COUNT(expr)統計 expr 非 NULL 的行數否否
COUNT(DISTINCT expr)統計 expr 唯一非 NULL 個數否是

關鍵特性總結

1. 所有分組函數忽略 NULL 值

若需將 NULL 納入計算,請使用 NVL、NVL2 或 COALESCE 轉換:

-- 計算平均提成,將 NULL 視為 0
SELECT AVG(NVL(comm, 0)) FROM emp;

2. DISTINCT vs ALL 關鍵字

  • DISTINCT:僅考慮不重複值
  • ALL:考慮所有值(含重複),為預設值,通常省略

3. 參數資料型別支援

可接受 CHAR、VARCHAR2、NUMBER、DATE 型別參數。

4. 隱式排序行為

使用 GROUP BY 時,Oracle 預隱式以升序排序結果集。需自訂排序請明確使用 ORDER BY。

函數適用資料型別對照

函數數值字串日期
MIN、MAX✓✓✓
AVG、SUM、VARIANCE、STDDEV✓✗✗
COUNT✓✓✓

NVL 與分組函數搭配實戰

-- 需求:統計各部門平均薪資,但將 NULL 薪資視為 0 參與計算
SELECT deptno, AVG(NVL(sal, 0)) AS avg_sal
FROM emp
GROUP BY deptno;

-- 需求:統計有提成員工比例
SELECT deptno, 
       COUNT(comm) * 100.0 / COUNT(*) AS comm_pct
FROM emp
GROUP BY deptno;

進階分組技巧

ROLLUP / CUBE 多維度彙總

-- ROLLUP:層級彙總(部門 → 總計)
SELECT deptno, job, COUNT(*), SUM(sal)
FROM emp
GROUP BY ROLLUP(deptno, job);

-- CUBE:所有維度組合彙總
SELECT deptno, job, COUNT(*), SUM(sal)
FROM emp
GROUP BY CUBE(deptno, job);

GROUPING SETS 自訂彙總組合

-- 僅需部門彙總與總計,不需職稱彙總
SELECT deptno, job, COUNT(*), SUM(sal)
FROM emp
GROUP BY GROUPING SETS((deptno, job), (deptno), ());

常見錯誤與避坑指南

錯誤寫法問題正確寫法
SELECT deptno, ename FROM emp GROUP BY deptno非聚合欄位未出現在 GROUP BYSELECT deptno, MAX(ename) 或加入 GROUP BY ename
WHERE AVG(sal) > 2000聚合函數不可用於 WHEREHAVING AVG(sal) > 2000
SELECT COUNT(*) FROM emp WHERE sal = AVG(sal)無法在同層級 WHERE 中引用聚合使用子查詢或窗口函數

總結

Oracle 分組函數是資料分析的基石。掌握七大核心函數特性、執行順序邏輯、NULL 處理機制與進階彙總語法(ROLLUP/CUBE/GROUPING SETS),能讓你高效完成從簡單統計到複雜多維分析的各類需求。實務中務必區分 WHERE(列過濾)與 HAVING(組過濾)的適用時機,避免語法錯誤與邏輯偏差。

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