SQLite | ゼロからはじめるSQL、30日で習得するSQLite:検索力強化 - Day11 集計②

SQL SQLite
スポンサーリンク

Day11 前半

「平均・最大・最小」で“数字の性格”をつかみにいく

Day10 では、COUNTSUM を使って
「何件あるか」「合計はいくらか」を数字で見るところまで来ました。

Day11 では、そこから一歩進んで

  • 平均値 AVG
  • 最大値 MAX
  • 最小値 MIN

を扱います。

ここからは、単に「多い・少ない」ではなく、
「このデータはどんな傾向を持っているのか」 を数字でつかみにいく世界です。


集計関数の“仲間”としての AVG / MAX / MIN

まず、位置づけを整理します。

COUNT → 行数を数える
SUM → 合計を出す

に対して、

AVG → 平均値を出す
MAX → 最大値を出す
MIN → 最小値を出す

どれも「複数行 → 1つの値」にまとめる、という意味で、同じ“集計関数の仲間”です。

Day11 前半では、まず「1つのテーブル全体に対して」これらを使うところから始めます。
(グループごとの集計は Day12 以降の GROUP BY で扱います。)


例に使うテーブルを決める

シンプルな「注文テーブル」で考える

イメージしやすいように、また orders テーブルを使います。

id | user_id | amount
---+---------+-------
 1 | 1       | 1200
 2 | 1       | 3000
 3 | 2       | 500
 4 | 3       | 8000
 5 | 2       | 1500

amount は「その注文の金額」とします。

このテーブルを使って、

  • 平均購入金額(1件あたり)
  • 最大購入金額
  • 最小購入金額

を順番に見ていきます。


AVG の基本

「1件あたり、だいたいどれくらいか」を数字にする

AVG は平均値(average)を出す関数です。

基本形はこうです。

SELECT AVG(列名) FROM テーブル名;
SQL

先ほどの orders テーブルで、「1件あたりの平均購入金額」を知りたいとします。

SELECT AVG(amount) FROM orders;
SQL

このとき、SQL が裏側でやっていることは、ざっくり言うとこうです。

  1. amount を全部足す(SUM(amount)
  2. 行数で割る(COUNT(*)

実際の計算を手でやってみると、

1200 + 3000 + 500 + 8000 + 1500 = 14200
行数は 5 件

14200 ÷ 5 = 2840

なので、結果はだいたいこうなります。

AVG(amount)
-----------
2840.0

ここで大事なのは、
「AVG は SUM と COUNT の組み合わせだ」というイメージ を持つことです。
そうすると、「平均って何をしている数字なのか」がぼやけずに済みます。


MAX の基本

「一番大きい値」を一発で取り出す

MAX は最大値(maximum)を出す関数です。

基本形はこうです。

SELECT MAX(列名) FROM テーブル名;
SQL

同じ orders テーブルで、「1件あたりの最大購入金額」を知りたいとします。

SELECT MAX(amount) FROM orders;
SQL

amount の値は、

1200, 3000, 500, 8000, 1500

なので、一番大きいのは 8000 です。

結果はこうなります。

MAX(amount)
-----------
8000

ここでのポイントは、
「MAX は“その列の中で一番大きい値だけ”を返す」ということです。
行そのものではなく、「値」だけです。


MIN の基本

「一番小さい値」を一発で取り出す

MIN は最小値(minimum)を出す関数です。

基本形はこうです。

SELECT MIN(列名) FROM テーブル名;
SQL

同じく、「1件あたりの最小購入金額」を知りたいとします。

SELECT MIN(amount) FROM orders;
SQL

amount の値は、

1200, 3000, 500, 8000, 1500

なので、一番小さいのは 500 です。

結果はこうなります。

MIN(amount)
-----------
500

MAXMIN をセットで見ると、
「このデータは、だいたい 500〜8000 の範囲にあるんだな」
という“レンジ感”がつかめます。


AVG / MAX / MIN と WHERE の組み合わせ

「全体」ではなく「一部」に対して使う

Day10 の COUNT / SUM と同じく、
AVG / MAX / MINWHERE と組み合わせると、ぐっと実用的になります。

たとえば、「user_id = 1 のユーザーの平均購入金額」を知りたいとします。

SELECT AVG(amount) FROM orders
WHERE user_id = 1;
SQL

user_id = 1 の行は、

amount = 1200
amount = 3000

なので、平均は (1200 + 3000) ÷ 2 = 2100 です。

同じように、「user_id = 2 の最大購入金額」を知りたいなら、

SELECT MAX(amount) FROM orders
WHERE user_id = 2;
SQL

user_id = 2 の行は 500 と 1500 なので、結果は 1500 です。

ここでも流れは同じです。

WHERE で「どの行を対象にするか」を決める。
AVG / MAX / MIN で、その行たちの値を「平均」「最大」「最小」にまとめる。

「対象を決めるのは WHERE、どうまとめるかを決めるのが集計関数」
という役割分担を、Day10 から引き続き意識しておいてください。


型の話をもう一度だけ

「平均・最大・最小を取りたい列は、数値として意味があるか?」

AVG / MAX / MIN も、基本的には「数値として意味のある列」に対して使います。

amount のような金額
age のような年齢
score のような点数

などです。

文字列に対して MAX / MIN を使うと、「辞書順で一番大きい/小さい文字列」を返しますが、
初心者のうちは「数値列に対して使うもの」と思っておいた方が混乱しません。

Day3 でやった「型を正しく選ぶ」は、ここでも効いてきます。
「あとで AVG / MAX / MIN したくなる列は、最初から数値型で定義しておく」
これは、テーブル設計の大事な視点の一つです。


セキュリティの視点から見る AVG / MAX / MIN

「極端な値」を見つけるためのレーダーになる

AVG / MAX / MIN は、
「このデータ、どこかおかしくないか?」を探すレーダーにもなります。

たとえば、

1件あたりの平均購入金額(AVG)が、いつもより急に跳ね上がっていないか。
1件あたりの最大購入金額(MAX)が、常識的な範囲を超えていないか。
最小値(MIN)が 0 やマイナスになっていないか(バグや不正の可能性)。

こうした「極端な値」は、
バグ・不正・攻撃のサインであることが少なくありません。

Day11 の段階では、
「AVG / MAX / MIN は、“データの性格”や“異常値”を探るための道具にもなる」
という感覚だけ持っておいてくれれば十分です。


Day11 前半のまとめ

AVG は平均値、MAX は最大値、MIN は最小値を出す集計関数。
どれも「複数行 → 1つの値」にまとめるという意味で、COUNT / SUM と同じ仲間。
WHERE と組み合わせることで、「全体」ではなく「一部」に対して平均・最大・最小を出せる。
集計したい列は、最初から数値型で定義しておくことが重要。
AVG / MAX / MIN は、ビジネス指標だけでなく、異常値や不正の兆候を探るレーダーにもなる。

後半では、
AVG / MAX / MIN を他の集計関数とまとめて使う例、
「平均だけ見る危うさ」と「最大・最小とセットで見る大事さ」、
もう少し実務に近い問い(例:1日の平均アクセス数、最大アクセス数など)
を扱って、集計の感覚をさらに立体的にしていきます。

タイトルとURLをコピーしました