集約関数は複数の入力値から単一の結果を計算します。 表9-43に組み込み集約関数を示します。 集約関数の特殊な構文に関する考察は項4.2.7で説明されています。 その他の入門的な情報については、項2.7を参照してください。
表 9-43. 集約関数
上記の関数は、count関数を除き、1行も選択されなかった場合NULL値を返すことに注意してください。 特に、行の選択がないsum関数は、予想されるであろうゼロではなくNULLを返します。 必要であれば、NULLをゼロと交換する目的でCOALESCE関数を使うことできます。
注意: 他のSQLデータベース管理システムでの作業に親しんだユーザは、集約がテーブル全体に適用される(言い替えるとWHERE句の指定がない)場合のPostgreSQLの集約関数の性能上の特徴に驚くかもしれません。 具体的には
SELECT min(col) FROM sometable;という問い合わせは、PostgreSQLではテーブル全体に対する逐次スキャンを使用します。 他のデータベースシステムでは、この形式の問い合わせを列へのインデックスが使用できるのであればそれを使用するように、最適化する可能性があります。 同様に、PostgreSQLでは、テーブル全体に対するmax()およびcount()集約関数は常に逐次スキャンを要求します。
PostgreSQLでは、ユーザ定義の集約問い合わせを可能にするために、この最適化を簡単に実装することはできません。 min()、max()およびcount()は集約関数用汎用APIを使用するように定義されているため、特定の環境下における関数実行に対して特別な処理をさせるための用意がありません。
幸いにも、min()およびmax()には簡単な回避方法があります。 以下の問い合わせは上の問い合わせと同じですが、もし問題の列にB-treeインデックスが存在する場合はそれを利用するという利点があります。
SELECT col FROM sometable ORDER BY col ASC LIMIT 1;(上の問い合わせでASCをDESCで置き換えて得られる)同様の問い合わせを使用してmax()を代行することができます。)
残念ながら、テーブル全体を対象としてcount()の性能を向上させるために使用できる、上同様の簡単な問い合わせはありません。