集約関数とNULL(aggregate functions / NULL)
まとめて1つの値を出す関数。COUNT、SUM、AVGなど。NULLを数に入れないので、結果がずれることがある。
もう少し詳しい説明
主な集約関数
| 関数 | 求めるもの | NULLの扱い |
|---|---|---|
| COUNT(*) | 行の数 | NULLの行も数える |
| COUNT(列) | その列に値がある行の数 | 数えない |
| SUM(列) | 合計 | 数えない |
| AVG(列) | 平均 | 数えない(分母にも入らない) |
| MAX(列) | 最大値 | 数えない |
| MIN(列) | 最小値 | 数えない |
COUNT(*) と COUNT(列) の違いが最も問われます。 行を数えるか、値のある行を数えるかです。
AVGの落とし穴
| 行 | 値 |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | NULL |
| 求め方 | 結果 |
|---|---|
| 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)
| 中身 | 結果 |
|---|---|
| 売上計が 500 | 500 |
| 売上計が NULL | 0 |
外部結合で相手が無かった行は、その列が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