- Day11 前半
- 「平均・最大・最小」で“数字の性格”をつかみにいく
- 集計関数の“仲間”としての AVG / MAX / MIN
- 例に使うテーブルを決める
- シンプルな「注文テーブル」で考える
- AVG の基本
- 「1件あたり、だいたいどれくらいか」を数字にする
- MAX の基本
- 「一番大きい値」を一発で取り出す
- MIN の基本
- 「一番小さい値」を一発で取り出す
- AVG / MAX / MIN と WHERE の組み合わせ
- 「全体」ではなく「一部」に対して使う
- 型の話をもう一度だけ
- 「平均・最大・最小を取りたい列は、数値として意味があるか?」
- セキュリティの視点から見る AVG / MAX / MIN
- 「極端な値」を見つけるためのレーダーになる
- Day11 前半のまとめ
Day11 前半
「平均・最大・最小」で“数字の性格”をつかみにいく
Day10 では、COUNT と SUM を使って
「何件あるか」「合計はいくらか」を数字で見るところまで来ました。
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 が裏側でやっていることは、ざっくり言うとこうです。
amountを全部足す(SUM(amount))- 行数で割る(
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;
SQLamount の値は、
1200, 3000, 500, 8000, 1500
なので、一番大きいのは 8000 です。
結果はこうなります。
MAX(amount)
-----------
8000
ここでのポイントは、
「MAX は“その列の中で一番大きい値だけ”を返す」ということです。
行そのものではなく、「値」だけです。
MIN の基本
「一番小さい値」を一発で取り出す
MIN は最小値(minimum)を出す関数です。
基本形はこうです。
SELECT MIN(列名) FROM テーブル名;
SQL同じく、「1件あたりの最小購入金額」を知りたいとします。
SELECT MIN(amount) FROM orders;
SQLamount の値は、
1200, 3000, 500, 8000, 1500
なので、一番小さいのは 500 です。
結果はこうなります。
MIN(amount)
-----------
500
MAX と MIN をセットで見ると、
「このデータは、だいたい 500〜8000 の範囲にあるんだな」
という“レンジ感”がつかめます。
AVG / MAX / MIN と WHERE の組み合わせ
「全体」ではなく「一部」に対して使う
Day10 の COUNT / SUM と同じく、AVG / MAX / MIN も WHERE と組み合わせると、ぐっと実用的になります。
たとえば、「user_id = 1 のユーザーの平均購入金額」を知りたいとします。
SELECT AVG(amount) FROM orders
WHERE user_id = 1;
SQLuser_id = 1 の行は、
amount = 1200
amount = 3000
なので、平均は (1200 + 3000) ÷ 2 = 2100 です。
同じように、「user_id = 2 の最大購入金額」を知りたいなら、
SELECT MAX(amount) FROM orders
WHERE user_id = 2;
SQLuser_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日の平均アクセス数、最大アクセス数など)
を扱って、集計の感覚をさらに立体的にしていきます。
