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

SQL SQLite
スポンサーリンク

Day10 後半

「数字で全体を見る」感覚を、もう一段深くする

前半で、COUNTSUM の基本と、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(平均)までは出しませんが、
COUNTSUM をセットで見ると、「平均」のイメージも自然に湧いてきます。

たとえば、「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」を扱うことで、集計の世界が一気に広がっていきます。

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