メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
ここまでのクエリはすべて行を返しました。集計関数は多数の行を読み、1 つの値を 返します。件数、合計、平均、最大値です。質問が 1 行ではなく集合についてのもので あるとき、最初に手に取るものです。 始める前に mysql -u root -p sakila でクライアントを開いてください。

集計関数の仕組み

AGGREGATE_FUNCTION を下の関数のいずれかに、COLUMN_NAME を読み取る列に、 TABLE_NAME をテーブルに置き換えます。 GROUP BY がなければテーブル全体が 1 つのグループなので、結果は常にちょうど 1 行です。カテゴリごとに 1 行を得るには、GROUP BY を 使います。

例

  1. 行を数える

テーブルに何が入っていても 1 行です。集計関数は必ず答えを返します。

  1. 複数の集計を一度に

それぞれが同じ 1,000 行を読みます。デフォルトの見出しは式全体になるため、 エイリアスで名前を付けてください。

  1. 金額の列を合計する

COUNT(*) と COUNT(column) は別の質問

COUNT(*) は行を数えます。COUNT(column) はその列に値がある行を数えるため、 NULL を飛ばします。
603 件の住所のうち、4 件には 2 行目がまったくありません。残りの 599 件は 空文字列を持っており、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 を返すと考えてください。

関連項目