集約関数とNULL(aggregate functions / NULL)

分類
テクノロジ系 データベース
出る試験
基本情報応用情報
重要度
★★★★☆

まとめて1つの値を出す関数。COUNT、SUM、AVGなど。NULLを数に入れないので、結果がずれることがある。

もう少し詳しい説明

主な集約関数

関数求めるものNULLの扱い
COUNT(*)行の数NULLの行も数える
COUNT(列)その列に値がある行の数数えない
SUM(列)合計数えない
AVG(列)平均数えない(分母にも入らない)
MAX(列)最大値数えない
MIN(列)最小値数えない

COUNT(*) と COUNT(列) の違いが最も問われます。 行を数えるか、値のある行を数えるかです。

AVGの落とし穴

行値
110
220
3NULL
求め方結果
AVG(列)(10+20)÷ 2 = 15
SUM(列) ÷ COUNT(*)30 ÷ 3 = 10

AVGはNULLの行を分母に入れません。 「NULLを0として平均したい」場合は、AVGでは出せません。

NULLは0でも空文字でもない

書き方意味
NULL値が入っていない
0数の0が入っている
空文字(”)長さ0の文字列が入っている
判定書き方
NULLかどうかIS NULL / IS NOT NULL
= NULL判定できない(真にも偽にもならない)

NULLを含む計算は、結果もNULLになります。 10 + NULL は10ではなくNULLです。

COALESCEで埋める

NULLのときに別の値を使いたい場合に使います。

COALESCE(売上計, 0)
中身結果
売上計が 500500
売上計が NULL0

外部結合で相手が無かった行は、その列がNULLになります。 そのまま引き算すると結果がNULLになるので、0に置き換えてから計算します。

COALESCE(売上計, 0) - COALESCE(原価計, 0) AS 粗利計

GROUP BYとの関係

集約関数は、まとめた単位ごとに1つの値を出します。

書き方出る行
GROUP BY 無しで SUM(金額)全体で1行
GROUP BY 区分 で SUM(金額)区分ごとに1行
条件を付ける場所使う句
まとめる前の1行ずつWHERE
まとめたあとの結果HAVING

WHEREの時点ではまだ合計が出ていないので、WHEREにSUMは書けません(SQLの句のページで扱っています)。

結合で合計がずれる

1対多の結合をすると、1の側の行が多の側の件数だけ現れます。

起きること中身
金額を合計すると多く出る同じ金額が何度も足される
件数を数えると多く出る同じ行が何度も数えられる

先に集計してから結合するという書き方で避けられます(副問合せのページで扱っています)。

試験ではこう出る

科目A(旧・午前)では、COUNT(*) と COUNT(列) の違いが問われます。NULLを数えるかどうかです。

NULLの扱いも頻出です。= NULL では判定できない、計算に混ざると結果がNULLになる、という部分です。

午後や応用情報(データベース)では、SQLの空欄に書く形で出ます。COALESCEで0に置き換える部分や、SUMの中の式が空欄になります。

関連する用語

SQLの句
GROUP BYとHAVING。集約関数を使う場所
SQLの結合とDISTINCT
結合で行が増えると、合計もずれる
副問合せ
集計の結果を表として扱う書き方
定義域制約とデータ型
NULLを許すかどうかの宣言

ミニクイズ

ある列に値が入っている行が7行、NULLの行が3行ある表に対して、COUNT(その列) を求めた。結果はいくつか。

正解は 1番:7

COUNTに列名を指定した場合、その列がNULLの行は数に入りません。値が入っている7行だけが数えられます。行そのものの数を数えたい場合はCOUNT(*)と書き、この場合は10になります。NULLを数に入れるかどうかが、2つの書き方の違いです。

間違えた用語の復習リストを見る →

この分野をまとめて解く → データベースのミニテスト(全35問)

最終更新:2026-11-09