集約関数は、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文で書く順番

❶ SELECT
❷ FROM
❸ WHERE
❹ GROUP BY
❺ HAVING
❻ ORDER BY

DBMSが実行する順番

Phase 1 ─ データの準備

実行1 FROM ─ テーブルを特定する
実行2 WHERE ─ 行を絞り込む
🚫 ここでは集約関数を使えない

Phase 2 ─ グループ化と集計

実行3 GROUP BY ─ 行をグループにまとめる
実行4 HAVING ─ 集計結果でグループを絞る
実行5 SELECT ─ 集約関数で集計+列を出力
✅ HAVING・SELECTでは集約関数OK

Phase 3 ─ 出力の整形

実行6 ORDER BY ─ 結果を並べ替える

急所: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を発行してデータを集計しています。