集計関数 

集計関数は、値の集合に基づく値を 1 つ返します。この関数を、SELECT ステートメントの項目リストの中で複数の式と共に使用する場合は、SELECT ステートメントに GROUP BY 句を指定する必要があります。その集計関数の結果が、SELECT ステートメントで取得される唯一の値である場合、GROUP BY 句は不要です。SQL99 でサポートされている集計関数とその構文を表 4.1 に示します。

 
SQL99 の集計関数
 
関数目的
AVG(expression)式で指定された列の平均値を計算します。
COUNT(expression)式で定義された行をカウントします。
COUNT(*)指定されたテーブルまたはビュー内の行をすべてカウントします。
MIN(expression)式で指定された列の最小値を検出します。
MAX(expression)式で指定された列の最大値を検出します。
SUM(expression)式で指定された列の値を合計します。
 

厳密に言えば、ANY、EVERY、および SOME も集計関数に含まれます。ただし、これらは検索範囲を指定するために使用されることが多いため、本マニュアルでもそのように扱っています。これらの関数の詳細については、第 3 章の SELECT . . . WHERE の説明を参照してください。

集計で処理される値の数は、テーブル内でクエリーの対象となる行の数に依存します。これが、スカラー関数と異なる点です。スカラー関数では、決まった種類のパラメータが一定の数だけ必要になります。

集計関数の一般的な構文は次のとおりです。

aggregate_function_name ( [ALL | DISTINCT] expression )

集計関数名には、AVG、COUNT、MAX、MIN、または SUM を指定します。ALL 句は、関数の値を集計する際にすべての行を評価します。これはデフォルトの動作なので、実際に指定する必要はありません。DISTINCT 句は、関数を評価する際に個別値のみを使用します。

AVG と SUM 

AVG 関数は、列または式の平均値を計算します。SUM 関数は、合計を計算します。どちらの関数にも数値を指定します。NULL 値は無視されます。また、どちらの関数も、列または式のすべての個別値の平均または合計を計算するために使用できます。

AVGSUM は、Microsoft SQL Server、MySQL、Oracle、および PostgreSQL でサポートされています。

 

次のクエリーは、書籍の種類別の年間平均売上を計算します。

 
SELECT   type, AVG( ytd_sales ) AS "average_ytd_sales"
FROM     titles
GROUP BY type;

次のクエリーは、書籍の種類別の年間総売上を計算します。

 
SELECT   type, SUM( ytd_sales )
FROM     titles
GROUP BY type;
COUNT 

COUNT 関数には、3 つのバリエーションがあります。COUNT(*) は、NULL 値を含むかどうかに関係なく、対象テーブルのすべての行をカウントします。COUNT(expression) は、指定された列または式において非 NULL 値を持つ行の数を計算します。COUNT(DISTINCT expression) は、指定された列または式において個別の非 NULL 値を持つ行の数を計算します。

 

次のクエリーは、テーブル内の行の総数をカウントします。

 
SELECT COUNT(*) FROM publishers;

次のクエリーは、出版社が存在している国の数をカウントします (重複分はカウントしません)。

 
SELECT COUNT(DISTINCT country) "Count of Countries"
FROM   publishers
MIN と MAX 

MIN(expression) と MAX(expression) は、行の集合における最小値と最大値 (文字列、日時、または数値) を検出します。これらの関数に DISTINCT または ALL を指定することもできますが、結果には影響しません。

MINMAX は、Microsoft SQL Server、MySQL、Oracle、および PostgreSQL でサポートされています。

MySQL では、同じ機能の LEAST( ) 関数と GREATEST( ) 関数もサポートされています。

 

次のクエリーは、レコードにあるタイトルのうち、売上の最も多いものと最も少ないものを検出します。

 
SELECT  'MIN' = MIN(ytd_sales), 'MAX' = MAX(ytd_sales)
FROM    titles;

集計関数は、GROUP BY 句と共に、クエリーの HAVING 句で使用されることがよくあります。次のクエリーは、当該カテゴリ (type) に含まれる全書籍の平均価格が $15.00 を超えるカテゴリをすべて選択します。

 
SELECT  type 'Category', AVG( price ) 'Average Price'
FROM    titles
GROUP BY type
HAVING AVG(price) > 15