# 集約 (集合関数)

この節は集約(ANSI SQL-92では集合関数、データベースの書籍によっては列関数と呼びます。)について説明します。集約は、行の集合に対して式を評価する方法を提供します。他の組込み関数は単式に対して作用しますが、集約は値の集合に対して作用して一つのスカラー値にまとめられます。組込みの集約により、値の集合に対して、式の最小値、最大値、合計、計数を行い、例えば行を数えるような事ができます。また組込みのものとは別に集約を作って、例えば標準偏差を計算するようなこともできます。

組込みの集約は、組込みの集約にて可能なデータ型にあるデータ型に作用させることができます。

表 1. 組込みの集約にて可能なデータ型
| 全データ型 | 組込みの数値型
--- | --- | ---
COUNT | X | X
MIN |  | X
MAX |  | X
AVG |  | X
SUM |  | X

集約は以下の文脈にのみ置くことができます。

- 選択式の選択項目
- HAVING節
- 集約がその問合せにあるならば、ORDER BY 節(別名を使う)つまり、選択式の選択項目に集約がある場合に限り、集約への別名をORDER BY 節に置くことができます。

選択式の選択項目にある全式は、集約か分類列である必要があります。(GROUP BY 節を参照してください。) (GROUP BY 節がないにもかかわらず、HAVING節がある場合も同様です。) なぜならば、選択式のResultSetは、スカラー(単値)かベクトル(副値)のいずれかでなければならず、その混合は許されていないからです。(集約はスカラーの値と評価され、列への参照はベクトルの値と評価されます。)例えば次の問合せはスカラーとベクトルの値が混ざっているので無効です。

    -- not valid
    SELECT MIN(flying_time), flight_id
    FROM Flights

集約にて外部への参照(相関)は無効です。つまり、副問合せが集約を含むならば、その集約が作用する式は、副問合せの外にある問合せの列を参照できません。 例えば、SUM演算子が外の問合せの列に対して行われているので、次の問合せは有効ではありません。

    SELECT c1
    FROM t1
    GROUP BY c1
    HAVING c2 >
        (SELECT t2.x
        FROM t2
        WHERE t2.y = SUM(t1.c3))

集約が外の問合せにある場合、そのResultSetのカーソルは更新可能ではありません。

この節には以下の集約があります。

- AVG関数
- COUNT 関数
- MAX関数
- MIN関数
- SUM関数

親トピック: 組み込み関数