與大多數其他關聯式資料庫產品一樣,PolarDB PostgreSQL版(相容Oracle)也支援彙總函式。彙總函式從多個輸入行計算單個結果。例如,有一些彙總可對一組行計算COUNT、SUM、AVG(平均值)、MAX(最大值)和MIN(最小值)。
樣本
以下樣本均在樣本資料庫基礎上進行查詢。
通過以下查詢找到最高和最低工資:
SELECT MAX(sal) highest_salary, MIN(sal) lowest_salary FROM emp;
返回結果如下:
highest_salary | lowest_salary ----------------+--------------- 5000 | 800 (1 row)
通過以下查詢找到工資最高的員工:
SELECT ename FROM emp WHERE sal = MAX(sal);
返回結果如下:
ERROR: aggregate functions are not allowed in WHERE
以上查詢無效,因為彙總函式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)
與WHERE與HAVING子句結合使用。
使用HAVING子句篩選這些分組行為每個部門產生一個輸出行。每個彙總結果都是針對與該部門匹配的行計算的。
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;
返回結果如下,僅為平均工資高於2000的那些部門給出相同的結果:
deptno | max --------+--------- 10 | 5000.00 20 | 3000.00 (2 rows)
使用WHERE子句,查詢每個部門中職位為分析師且工資最高的員工。
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。