集約関数は、SQLを学び始めると早い段階で登場するテーマです。SELECT文でデータを取り出すだけでなく「合計」「平均」「件数」といった集計ができるようになると、データベース操作の幅が一気に広がります。
対象試験と出題頻度
集約関数は、基本情報技術者・応用情報技術者で出題されるテーマです。
SELECT文の問題でほぼ必ず登場し、GROUP BY句やHAVING句と組み合わせた形で出題されるのが定番です。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
情報処理試験を勉強していると、「SUM とか AVG って何となくわかるけど、COUNT(*) と COUNT(列名) の違いは?」と混乱しがちです。
集約関数(Aggregate Function)とは、一言で言うと
「SQLで複数行のデータを1つの値に集計する関数群」
のことです。
イメージとしては、「電卓の集計ボタン」です。
レシートが100枚あるとき、1枚1枚の金額を眺めるのではなく「合計いくら?」「平均いくら?」「何枚ある?」とボタン1つで答えを出す機能が集約関数に当たります。
📊 集約関数の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Aggregate Function |
| 別名 | 集計関数、グループ関数 |
| 代表的な関数 | SUM / AVG / COUNT / MAX / MIN |
| 使用場所 | SELECT句、HAVING句 |
| セットで覚える句 | GROUP BY句、HAVING句 |
解説
データベースに蓄積されたデータは、そのまま一覧表示するだけでは意味がありません。
「売上合計はいくらか」「平均単価はいくらか」「何件のレコードがあるか」など、複数行をまたいだ集計が求められる場面が大半です。
この「複数行→1つの値」への変換を担うのが集約関数です。
5つの集約関数の役割
試験で問われる集約関数は5種類です。
それぞれの機能を正確に区別することが得点の土台になります。
| 関数 | 機能 | 記述例 | 対象データ型 |
|---|---|---|---|
| SUM | 合計値を求める | SUM(数量) |
数値型のみ |
| AVG | 平均値を求める | AVG(点数) |
数値型のみ |
| COUNT | 行数を数える | COUNT(*) / COUNT(列名) |
全データ型 |
| MAX | 最大値を求める | MAX(金額) |
全データ型 |
| MIN | 最小値を求める | MIN(金額) |
全データ型 |
SUM と AVG は数値型の列にしか使えませんが、COUNT・MAX・MIN は文字列型や日付型にも使えます。MAX/MIN を日付列に適用すると「最新日 / 最古日」を取得できます。
COUNT(*) と COUNT(列名) の違い
COUNT だけは引数の指定方法が2通りあり、ここを正確に区別できるかが問われます。
| 書き方 | 動作 |
|---|---|
COUNT(*) |
NULLを含むすべての行を数える |
COUNT(列名) |
指定した列がNULLでない行だけを数える |
図解:集約関数の動作イメージ
次のサンプルデータに対して、各集約関数がどのような値を返すかを図で確認します。
売上テーブル(5行・NULLあり)
| 行番号 | 商品名 | 金額 |
|---|---|---|
| 1 | ノートPC | 80,000 |
| 2 | マウス | 2,000 |
| 3 | キーボード | 5,000 |
| 4 | モニター | 30,000 |
| 5 | USBケーブル | NULL |
▼ 各集約関数を実行
SUM(金額) ─ 合計値を求める
対象行:行1〜行4(NULLの行5は無視される)
80,000 + 2,000 + 5,000 + 30,000 = 117,000
※ NULL は計算に含まれない。数値型の列にのみ使用可。
AVG(金額) ─ 平均値を求める
対象行:行1〜行4(NULLの行5は母数にも含まない)
(80,000 + 2,000 + 5,000 + 30,000) ÷ 4 = 29,250
※ ÷5 ではなく ÷4。NULLの行は「存在しないもの」として扱われる。
COUNT ─ 行数を数える(2パターンの違いに注意)
COUNT(*)
NULLを含むすべての行を数える
対象:行1, 行2, 行3, 行4, 行5(NULL)
結果 = 5
COUNT(金額)
NULLを除外した行だけを数える
対象:行1, 行2, 行3, 行4 行5(NULL)
結果 = 4
※ この違いは試験の頻出ポイント。COUNT(*)だけがNULLを数える。
MAX(金額) ─ 最大値を求める
対象行:行1〜行4(NULLは無視)
80,000 , 2,000 , 5,000 , 30,000 → 最大値 = 80,000
※ 数値以外(日付型・文字列型)にも使用可。日付なら最新日が返る。
MIN(金額) ─ 最小値を求める
対象行:行1〜行4(NULLは無視)
80,000 , 2,000 , 5,000 , 30,000 → 最小値 = 2,000
※ MAXと同様、数値以外にも使用可。日付なら最古日が返る。
⚠ NULLの扱い まとめ
| 関数 | NULLの扱い | 上記テーブルでの結果 |
|---|---|---|
| SUM(金額) | NULLを除外して合計 | 117,000 |
| AVG(金額) | NULLを除外(母数にも含めない) | 29,250(÷4) |
| COUNT(*) | NULLを含む全行を数える | 5 |
| COUNT(金額) | NULLを除外して数える | 4 |
| MAX(金額) | NULLを除外して最大値 | 80,000 |
| MIN(金額) | NULLを除外して最小値 | 2,000 |
※ COUNT(*) だけが唯一NULLを数える。他はすべてNULLを「存在しないもの」として無視する。
GROUP BY句・HAVING句との関係
集約関数は単独で使うと「テーブル全体」を1つのグループとして集計します。
「部署ごとの平均給与」「商品カテゴリごとの売上合計」のように、グループ単位で集計したい場合はGROUP BY句を併用します。
さらに、グループ化した結果に対して条件をかけるにはHAVING句を使います。
WHERE句はグループ化の前に行を絞り込むのに対し、HAVING句はグループ化の後に集計結果でグループを絞り込む。
この順序の違いがポイントです。
SQL文で書く順番
❷ FROM
❸ WHERE
❹ GROUP BY
❺ HAVING
❻ ORDER BY
DBMSが実行する順番
Phase 1 ─ データの準備
Phase 2 ─ グループ化と集計
Phase 3 ─ 出力の整形
急所:WHERE句はPhase 1(グループ化の前)で動く。そのため AVG(点数) >= 600 のように集約関数を書くと構文エラーになる。グループ化後の条件はPhase 2 のHAVING句に書く。
SQL記述例:GROUP BY + HAVING
具体的なSQL文で確認します。「部署ごとの平均給与が300,000円以上の部署」を取得するケースです。
SELECT 部署名, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 部署名 HAVING AVG(給与) >= 300000 ORDER BY 平均給与 DESC;
ここだけは確実に押さえてください。GROUP BY で指定していない列を SELECT 句に直接書くことはできません(集約関数の引数としてなら可)。
この構文ルールを破った選択肢はすべて誤りと判断できます。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 集約関数の核心を3行で
・SUM(合計)・AVG(平均)・COUNT(件数)・MAX(最大)・MIN(最小)の5種類
・GROUP BYでグループ化し、HAVINGで集計結果を絞り込む
・WHERE句では集約関数を使えない——条件による絞り込みはHAVING句
試験ではこう出る!
集約関数は、FE・APの午前問題でSQL文の穴埋め・正誤判定として繰り返し出題されています。午後のデータベース問題でも空欄補充で頻繁に登場します。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H27秋 午前 問28 |
SUM・AVG・COUNT・MAXのうち最大の値を返すSQL文を選ぶ問題 | ・各関数の計算結果を正確に求める力 ・WHERE句で行を絞った後の関数適用 |
| FE H31春 午前 問27 |
AVG関数を使ったSQL文の空欄にGROUP BY+ORDER BYの正しい組合せを入れる問題 | ・GROUP BY句に指定すべき列の判断 ・SELECT句に書ける列の構文ルール |
| FE H21秋 午前 問33 |
AVG・SUM・WHERE句と集約関数の組合せで、構文として正しいSQL文を選ぶ問題 | ・WHERE句でSUMは使えない ・AVG(SUM(…))のネストは不可 |
| AP H31春 午前 問28 |
AVG・GROUP BY・HAVINGを組み合わせて条件に合うグループを抽出するSQL文を選ぶ問題 | ・WHERE句→GROUP BY句の処理順序 ・HAVING句に集約関数を書くルール |
📝 IPA試験での出題パターン
パターン1:「各関数の戻り値を比較させる」
同じテーブルに対してSUM・AVG・COUNT・MAXをそれぞれ適用したSQL文が4つ並び、「最も大きい値を返すのはどれか」を問う形式。各関数に対応する行を手計算できれば正解にたどり着ける。
パターン2:「GROUP BY+HAVINGの構文を完成させる」
SQL文の一部が空欄になっており、GROUP BY・HAVING・ORDER BYの正しい組合せを選ばせる。ひっかけとして「GROUP BYで指定していない列をSELECTに書く」「WHERE句に集約関数を入れる」構文エラーの選択肢が混ざる。
パターン3:「午後問題のSQL穴埋め」
FE午後・AP午後のデータベース問題で、空欄にCOUNTやAVGなどの関数名を埋めさせる形式。問題文の日本語(「件数を求める」→COUNT、「平均を求める」→AVG)と関数を正しく対応付ける力が必要。
試験ではここまででOKです。ウィンドウ関数(OVER句)との違いなどは応用情報の午後で稀に出る程度なので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. SQLの集約関数に関する記述として、最も適切なものはどれでしょうか?
- A. WHERE句の中で AVG(点数) >= 600 のように集約関数を使い、グループ化後の結果を絞り込むことができる。
- B. GROUP BY句でグループ化した場合、SELECT句にはGROUP BYで指定した列と集約関数のみを記述できる。
- C. COUNT(列名) はNULL値を含むすべての行を数え、COUNT(*) はNULL値を除外した行だけを数える。
正解と解説を見る
正解:B
解説:
GROUP BY句で行をグループ化した場合、SELECT句に書けるのは「GROUP BYで指定した列」と「集約関数の結果」に限られます。これはSQLの構文ルールであり、FE H31春 問27やAP H31春 問28でも問われた頻出知識です。
選択肢Aは誤りです。WHERE句はGROUP BYによるグループ化の前に実行されるため、集約関数を使うことができません。グループ化後の集計結果で絞り込むにはHAVING句を使います。選択肢Cは逆です。COUNT(*)がNULLを含むすべての行を数え、COUNT(列名)はNULLを除外した行だけを数えます。
よくある質問(FAQ)
Q. DISTINCT を集約関数の中に書けますか?
書けます。たとえば COUNT(DISTINCT 部署名) と指定すると、重複を除いたユニークな部署名の件数だけを数えます。SUM や AVG でも同様に SUM(DISTINCT 金額) のように使えますが、試験では COUNT との組合せが最も問われます。
Q. 集約関数でNULLはどのように扱われますか?
COUNT(*)を除き、すべての集約関数はNULL値を無視して計算します。たとえば金額列に 100, NULL, 300 の3行がある場合、SUM(金額) は 400、AVG(金額) は 200(= 400 ÷ 2)になります。NULLの行は「存在しないもの」として扱われ、平均の母数にも含まれません。
Q. 集約関数とウィンドウ関数は何が違いますか?
集約関数はGROUP BYと組み合わせて「複数行を1行にまとめる」のに対し、ウィンドウ関数(OVER句を付ける)は元の行を維持したまま各行に集計結果を付加します。たとえば「全社員の行を保持しつつ、部署ごとの平均給与を横に表示する」場合はウィンドウ関数を使います。IPA試験では応用情報 令和6年秋 午前問30でウィンドウ関数が出題された実績があります。
Q. 実務で集約関数を使う場面はどのようなものですか?
日次・月次の売上レポート作成が典型です。「商品カテゴリ別の売上合計(SUM)」「顧客ごとの平均購入金額(AVG)」「月間の注文件数(COUNT)」など、業務のKPI算出にはほぼ必ず集約関数が使われます。BIツールやダッシュボードも裏側では集約関数を含むSQLを発行してデータを集計しています。