與大多數其他關聯式資料庫產品一樣,PolarDB PostgreSQL版(相容Oracle)也支援彙總函式。彙總函式從多個輸入行計算單個結果。例如,有一些彙總可對一組行計算 COUNT、SUM、AVG(平均值)、MAX(最大值)和 MIN(最小值)。
例如,可通過以下查詢找到最高和最低工資:
SELECT MAX(sal) highest_salary, MIN(sal) lowest_salary FROM emp;
highest_salary | lowest_salary
----------------+---------------
5000.00 | 800.00
(1 row)
如果要找到工資最高的員工,我們可能會嘗試以下查詢:
SELECT ename FROM emp WHERE sal = MAX(sal);
ERROR: aggregates not allowed in WHERE clause
此查詢無效,因為彙總函式 MAX 不能在 WHERE 子句中使用。存在此限制的原因是,WHERE 子句確定將進入彙總狀態的行,因此必須在計算彙總函式之前對該子句進行求值。但是,可通過使用子查詢來重新表述該查詢以達到預期結果:
SELECT ename FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
ename
-------
KING
(1 row)
子查詢是一項獨立的計算,它擷取自己的結果,與外部查詢互不影響。
在與 GROUP BY 子句結合使用時,彙總也十分有用。例如,以下查詢擷取每個部門中的最高工資。
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;
deptno | max
--------+---------
10 | 5000.00
20 | 3000.00
30 | 2850.00
(3 rows)
此查詢為每個部門產生一個輸出行。每個彙總結果都是針對與該部門匹配的行計算的。可使用 HAVING 子句篩選這些分組行。
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;
deptno | max
--------+---------
10 | 5000.00
20 | 3000.00
(2 rows)
以下查詢僅為平均工資高於 2000 的那些部門給出相同的結果。
最後,以下查詢僅考慮每個部門中職位為分析師且工資最高的員工。
SELECT deptno, MAX(sal) FROM emp WHERE job = 'ANALYST' GROUP BY deptno HAVING AVG(sal) > 2000;
deptno | max
--------+---------
20 | 3000.00
(1 row)
WHERE 與 HAVING 子句之間存在一個細微的區別。WHERE 子句在執行分組和應用彙總函式之前對行進行篩選。HAVING 子句在對行進行分組並為每個組計算彙總函式後對結果應用篩選條件。
因此,在上一樣本中,僅考慮職位為分析師的員工。在此子集中,員工按部門進行分組,最終結果是只有組中分析師的平均工資高於 2000 的那些組。這僅適用於部門 20 組,部門 20 中的分析師最高工資為 3000.00。