VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
mysql -u root -p sakila でクライアントを開いてください。
集計関数の仕組み
AGGREGATE_FUNCTION を下の関数のいずれかに、COLUMN_NAME を読み取る列に、
TABLE_NAME をテーブルに置き換えます。
GROUP BY がなければテーブル全体が 1 つのグループなので、結果は常にちょうど
1 行です。カテゴリごとに 1 行を得るには、GROUP BY を
使います。
例
- 行を数える
- 複数の集計を一度に
- 金額の列を合計する
COUNT(*) と COUNT(column) は別の質問
COUNT(*) は行を数えます。COUNT(column) はその列に値がある行を数えるため、
NULL を飛ばします。
COUNT はそれを他と同じ値として扱います。COUNT が
見ているのは NULL かどうかであり、空白かどうかではありません。IS NULL
のレッスンでその違いを扱います。
すべての集計関数は NULL を飛ばす
このルールはCOUNT に限ったものではありません。どの集計関数も NULL を見ない
ため、何も入っていない列には平均する対象がありません。id の平均を取るのは
無意味な計算ですが、このクエリがそれを行うのは、original_language_id が
Sakila で唯一、すべての行で NULL である列だからです。
AVG は 0 ではなく NULL を返しました。これが
最も重要になるのは、ときどきしか値が入っていない列に対する AVG です。平均は
全行ではなく値を持つ行に対するものであり、この 2 つの数は同じではありません。
対象が何もないときの SUM も NULL ですが、対象が何もないときの COUNT は 0 です。
まとめ
- 多数の行を 1 つの値にまとめるには集計関数を使います。
GROUP BYがないときは、ちょうど 1 行が返ると考えてください。COUNT(*)は行の数、COUNT(column)は値を持つ行の数と読んでください。- すべての集計関数は NULL を飛ばすため、平均は値を持つ行に対するものです。
- 対象が何もないとき、
SUMとAVGは 0 ではなく NULL を返すと考えてください。
関連項目
- GROUP BY — 全体で 1 行ではなく、カテゴリごとに 1 行の結果
- COUNT DISTINCT — 行ではなく異なる値を数える
- IS NULL — これらの関数が飛ばす値
- MySQL の GROUP BY のパフォーマンス — 大規模な集計のコスト