Day10 後半
「数字で全体を見る」感覚を、もう一段深くする
前半で、COUNT と SUM の基本と、WHERE との組み合わせはつかめました。
後半では、それをもう少し「実務っぽい問い」に近づけていきます。
ここで意識してほしいのは、
「行を見る」モードと「数字で全体を見る」モードを、頭の中で切り替えられるようになること
です。
「まず件数だけ知りたい」という場面をイメージする
「中身を見る前に、規模感を知る」という使い方
たとえば、access_logs というアクセスログのテーブルがあるとします。
id | user_id | path | created_at
---+---------+------------ +-------------------
1 | 1 | /login | 2025-04-01 10:00
2 | 2 | /products | 2025-04-01 10:01
3 | 1 | /products | 2025-04-01 10:02
...
ここで、いきなり中身を全部見るのではなく、
「まず、今日のログが何件あるかだけ知りたい」という場面を考えます。
SELECT COUNT(*) FROM access_logs
WHERE date(created_at) = '2025-04-01';
SQLこれで、「2025-04-01 のログ件数」が 1つの数字で返ってきます。
この数字を見て、
いつもと同じくらいか
明らかに少ない(システムが止まっている?)
明らかに多い(攻撃やバグの可能性?)
といった“ざっくりした判断”ができます。
ここでのポイントは、
「中身を1行ずつ見る前に、まず件数で全体の空気感をつかむ」
という使い方です。
「全体の合計」と「一部の合計」を意識して使い分ける
「売上全体」と「特定ユーザーの売上」のイメージ
前半で出した orders テーブルをもう一度使います。
id | user_id | amount
---+---------+-------
1 | 1 | 1200
2 | 1 | 3000
3 | 2 | 500
4 | 3 | 8000
ここで、次の2つの問いを比べてみます。
「サイト全体の売上合計はいくらか」
「user_id = 1 のユーザーの売上合計はいくらか」
前者は「全体の合計」、後者は「一部の合計」です。
全体の合計は、WHERE なしの SUM です。
SELECT SUM(amount) FROM orders;
SQL一部の合計は、WHERE 付きの SUM です。
SELECT SUM(amount) FROM orders
WHERE user_id = 1;
SQLこの2つを並べて考えると、
「WHERE を付けるかどうかで、“全体を見るか”“一部を見るか”を切り替えている」
ということがよく分かります。
COUNT と SUM を組み合わせた「平均」のイメージ
まだ AVG は出さないけれど、考え方だけ先に触れておく
Day10 では AVG(平均)までは出しませんが、COUNT と SUM をセットで見ると、「平均」のイメージも自然に湧いてきます。
たとえば、「1人あたりの平均購入金額」を考えたいとします。
直感的には、
全体の購入金額の合計(SUM) ÷ 注文の件数(COUNT)
です。
実際の SQL では AVG(amount) と書けますが、
頭の中では「SUM と COUNT の組み合わせなんだな」と理解しておくと、
集計の構造がスッと入ってきます。
ここで大事なのは、
「SUM は“足し算”、COUNT は“個数”、その組み合わせでいろんな指標が作れる」
という感覚です。
「行を見る」と「数字で見る」を行き来する練習
まず数字で全体を見てから、気になるところを行で掘る
もう少し具体的な流れをイメージしてみます。
たとえば、orders テーブルで「怪しい動きがないか」をざっくり見たいとします。
まず、「今日の注文件数」と「今日の売上合計」を数字で見ます。
SELECT COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
WHERE date(created_at) = '2025-04-01';
SQLここで、
件数がいつもより多すぎる
合計金額が異常に大きい
といった違和感があれば、次のステップに進みます。
「どのユーザーの注文が多いのか」「どの注文が大きいのか」を、今度は行として見に行くわけです。
SELECT * FROM orders
WHERE date(created_at) = '2025-04-01'
ORDER BY amount DESC
LIMIT 10;
SQLこの流れは、
数字で全体像をつかむ(COUNT / SUM)
→ 気になるところを行として掘る(SELECT * + WHERE + ORDER BY + LIMIT)
という、非常に実務的なパターンです。
セキュリティの視点から見る「集計の怖さ」と「強さ」
「1行ずつ見えないから安全」ではない、という話
集計結果は「数字だけ」なので、
一見すると「個人情報が直接見えないから安全そう」に感じるかもしれません。
しかし、
「特定ユーザーの合計購入金額」
「特定IPからのアクセス件数」
などは、それ自体がセンシティブな情報になり得ます。
たとえば、
「このユーザーは年間でいくら使っているか」
という情報は、マーケティング的にも、攻撃者にとっても価値があります。
だからこそ、
「集計結果だから安全」とは決して思わないこと
が大事です。
一方で、
「全体の件数や合計をざっくり見ることで、異常を早く検知できる」
という意味で、集計はセキュリティ上の強力な武器にもなります。
この「両刃の剣」感を、頭の片隅に置いておいてください。
小さな練習で締める
日本語の問いを、COUNT / SUM に翻訳してみる
頭の中で、次の日本語を SQL にしてみてください。
ユーザーは全部で何人いるか。
20歳以上のユーザーは何人いるか。
全注文の売上合計はいくらか。
user_id = 2 のユーザーの売上合計はいくらか。
全部、COUNT(*) と SUM(amount) に WHERE を付けるかどうか、という組み合わせで書けるはずです。
Day10 後半のまとめ
COUNT / SUM は、「行そのもの」ではなく「行の集合を数字に変える」ための道具。WHERE を付けるかどうかで、「全体を見るか」「一部を見るか」を切り替えられる。
まず集計で全体像をつかみ、そのあと気になる部分を行として掘る、という流れが実務的。
集計結果も立派なセンシティブ情報になり得る一方で、異常検知の強力な武器にもなる。
ここまで来たあなたは、
「行をそのまま見る検索」と「数字で全体を見る集計」を、意識して使い分けられる入り口に立っています。
次のステップでは、GROUP BY を使って「グループごとの COUNT / SUM」を扱うことで、集計の世界が一気に広がっていきます。
