基本情報技術者試験 (FE) 科目 A — データベース

集約関数 — COUNT・SUM・AVG・MAX・MIN

定義

集約関数は複数の行を 1 つの値にまとめる関数。COUNT は件数、SUM は合計、AVG は平均、MAX と MIN は最大・最小を返す。COUNT(*) 以外は NULL を無視して集計する。

集約関数は複数行を 1 つの値にする

ここまでの SQL は「行を絞って列を取り出す」だけでした。集約関数は、複数の行をまとめて 1 つの値を計算します。

関数意味NULL の扱い
COUNT(*)行数NULL も数える
COUNT(列)その列が NULL でない行数NULL を除く
SUM(列)合計NULL を除く
AVG(列)平均NULL を除く(分母からも除く
MAX(列) / MIN(列)最大 / 最小NULL を除く

NULL の扱いが試験の狙いどころ

サンプルの従業員表には、給与が未設定(NULL)の行が 1 行あります。 7 行のうち 1 行が NULL なので:

  • COUNT(*)7(NULL も数える)
  • COUNT(給与)6(NULL を除く)
  • AVG(給与)6 行の合計 ÷ 6(7 では割らない)

「NULL を 0 とみなすか」ではなく「集計の対象から外す」のが SQL の規則です。平均を出すときに分母が変わる点が特に狙われます。

試す: COUNT(*) と COUNT(給与) の差が、給与が NULL の 1 行分

リセットで表の中身も元に戻ります
エディタを読み込み中…

対象が 0 件のときの戻り値

SELECT COUNT(*), SUM(給与) FROM 従業員 WHERE 部門コード = 'D99'
-- COUNT は 0、SUM は NULL

COUNT だけが 0 を返し、他は NULL です。 「該当が無い」ことと「合計が 0」は違う、という考え方です。

試す: COUNT だけが 0 を返し、SUM と AVG は NULL になる

リセットで表の中身も元に戻ります
エディタを読み込み中…

集約関数は WHERE には書けない

WHERE COUNT(*) > 1 はエラーになります。 WHERE は 1 行ずつの絞り込みで、集約より前に評価されるからです。 グループに対する条件はHAVING に書きます。 次のレッスンで詳しく扱います。

試験で問われるポイント

  • COUNT(*) と COUNT(列) の値のずれ。NULL を含む列で必ず問われます
  • AVG が NULL を分母から除くこと
  • 0 件のときに SUM が NULL(0 ではない)こと
  • 集約関数を WHERE に書いた選択肢は誤りだと見抜けること

よくある疑問

Q.COUNT(*) と COUNT(列) はどう違いますか?
A.COUNT(*) は行数をそのまま数えるので NULL も含みます。COUNT(列) はその列が NULL でない行だけを数えます。NULL を含む列で両者の値がずれることを問う問題が頻出です。
Q.対象が 1 行も無いとき、集約関数は何を返しますか?
A.COUNT は 0 を返しますが、SUM・AVG・MAX・MIN は NULL を返します。0 ではありません。「合計が 0 円」と「合計が計算できない」を区別するためです。
Q.AVG は NULL を 0 として平均しますか?
A.しません。NULL の行は分母からも除かれます。3 行のうち 1 行が NULL なら、残り 2 行の合計を 2 で割ります。0 として扱うと平均が下がってしまうため、この違いは重要です。

集約関数」の練習問題 2

読んだ内容がそのまま出題されます。解答すると解説と、 その SQL を実行シミュレーターで開くリンクが出ます。

自由に試す / 他のレッスンを読む

データベース分野をもっと学ぶ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

プログラムの読み方でつまずいたら。

たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。

無料相談を予約する →
受講者の声 (DB・SQL コース)
menta レビュー原文を見る →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講