他のほとんどのリレーショナルデータベースサービスと同様に、Oracle と互換性のある PolarDB データベースは集計関数をサポートしています。 集計関数は、複数の入力行から単一の結果を計算します。 たとえば、集計を使用して、一連の行の 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)
このクエリは、部門ごとに 1 つの出力行を生成します。 各集計結果は、その部門に一致する行に対して計算されます。 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 です。