Day10 前半
「行そのもの」ではなく「行の“数”や“合計”を見る」世界に入る
Day9 までは、
どの行を取るか(WHERE)
どの順番で並べるか(ORDER BY)
どれだけ取るか(LIMIT)
をコントロールしてきました。
Day10 からは、視点を少し変えます。
「行そのものを見る」のではなく、「行をまとめて数える・合計する」 という世界です。
ここで登場するのが、集計関数 COUNT と SUM。
「ユーザーが何人いるか」「売上の合計はいくらか」といった、現実の仕事で超頻出の問いを、SQL で表現できるようになります。
集計関数とは何か
「複数行を1つの値に“ぎゅっ”とまとめる関数」
普通の SELECT は、「条件に合う行を、そのままの形で返す」ものでした。
SELECT * FROM users
WHERE age >= 20;
SQLこれは、「20歳以上のユーザーの行」を、そのまま一覧として返します。
一方、集計関数は、
複数行を1つの値にまとめる ための関数です。
たとえば、
COUNT → 行の数を数えるSUM → 数値列の合計を出す
というように、「たくさんの行」から「1つの数字」を作り出します。
この「行の集合 → 1つの値」という変換が、集計の本質です。
COUNT の基本
「何行あるか」を数える、一番シンプルな集計
まずは COUNT からいきます。COUNT は、「何行あるか」を数える関数です。
基本形はこうです。
SELECT COUNT(*) FROM テーブル名;
SQL* は「そのテーブルの行全体」を意味していて、COUNT(*) は「そのテーブルに何行あるか」を返します。
たとえば、users テーブルがこうだとします。
id | name | age
---+------------+----
1 | 山田太郎 | 25
2 | 佐藤花子 | 19
3 | 鈴木一郎 | 30
4 | 高橋健 | 22
5 | 田中花子 | 28
このとき、
SELECT COUNT(*) FROM users;
SQLを実行すると、結果はこうなります。
COUNT(*)
--------
5
行が5つあるので、5 が返ってきます。
ここでのポイントは、
「行の中身」ではなく「行の数」だけを見ている
ということです。
COUNT と WHERE を組み合わせる
「条件に合う行が何件あるか」を数える
COUNT は、WHERE と組み合わせることで真価を発揮します。
たとえば、「20歳以上のユーザーが何人いるか」を知りたいとします。
SELECT COUNT(*) FROM users
WHERE age >= 20;
SQLこれは、「users テーブルの中で、age が 20 以上の行が何件あるか」を数えます。
先ほどのテーブルなら、
山田太郎(25) → 該当
佐藤花子(19) → 不該当
鈴木一郎(30) → 該当
高橋健(22) → 該当
田中花子(28) → 該当
なので、結果は 4 になります。
COUNT(*)
--------
4
ここで大事なのは、
「WHERE で絞り込んだ“あと”の行を数えている」
という流れです。
「どの行を数えるか」を決めるのは、あくまで WHERE。COUNT は、その結果を「何件か」に変換しているだけです。
SUM の基本
「数値列の合計」を出す、もう一つの代表的な集計
次に SUM です。SUM は、「数値列の合計」を出す関数です。
基本形はこうです。
SELECT SUM(列名) FROM テーブル名;
SQLたとえば、次のような orders テーブルがあるとします。
id | user_id | amount
---+---------+-------
1 | 1 | 1200
2 | 1 | 3000
3 | 2 | 500
4 | 3 | 8000
ここで、「全注文の金額合計(売上合計)がいくらか」を知りたいとします。
SELECT SUM(amount) FROM orders;
SQL結果はこうなります。
SUM(amount)
-----------
12700
1200 + 3000 + 500 + 8000 = 12700
これを SQL がやってくれているわけです。
SUM と WHERE を組み合わせる
「条件に合う行だけの合計」を出す
SUM も COUNT と同じく、WHERE と組み合わせることで威力を発揮します。
たとえば、「user_id = 1 のユーザーの合計購入金額」を知りたいとします。
SELECT SUM(amount) FROM orders
WHERE user_id = 1;
SQLuser_id = 1 の行は、
id=1, amount=1200
id=2, amount=3000
なので、結果は 4200 になります。
SUM(amount)
-----------
4200
ここでも流れは同じです。
WHERE で「どの行を対象にするか」を決める。
SUM で、その行たちの amount を合計する。
「対象の行を決めるのは WHERE、集計するのは COUNT / SUM」
という役割分担を、頭の中でハッキリさせておくと理解が一気に楽になります。
COUNT / SUM を使うときの型の重要性
「数える対象」「足し算する対象」が正しい型かを意識する
COUNT(*) は行を数えるので、型はあまり気にしません。
しかし SUM(列名) は、その列が「数値として意味を持つか」がとても重要です。
もし amount を TEXT 型で持っていたら、
「文字列としての ‘1000’」を足し算することになり、意図しない結果やエラーの原因になります。
Day3 で学んだ「数値は INTEGER で持つ」という設計が、ここで効いてきます。
「あとで SUM したくなる列は、最初から数値型で定義しておく」
これはテーブル設計の大事な視点です。
セキュリティの視点から見る COUNT / SUM
「全体像をざっくり把握する」ことは、異常検知にもつながる
COUNT や SUM は、単なる集計だけでなく、セキュリティ的な「異常検知」にも使われます。
たとえば、
今日のアクセスログの件数(COUNT)が、いつもの10倍になっていないか。
特定ユーザーの購入金額(SUM)が、異常に大きくなっていないか。
こうした「全体像の数字」を見ることで、
「何かおかしいぞ?」という違和感を早くキャッチできます。
Day10 の段階では、
「COUNT / SUM は、“行の集合”を数字に変えて、全体像を見せてくれる道具」
という感覚だけ持っておいてくれれば十分です。
Day10 前半のまとめ
集計関数は、「複数行を1つの値にまとめる」ための関数。COUNT(*) は行数を数える。WHERE と組み合わせると「条件に合う行が何件か」が分かる。SUM(列名) は数値列の合計を出す。WHERE と組み合わせると「条件に合う行だけの合計」が分かる。
集計したい列は、最初から数値型で定義しておくことが重要。
COUNT / SUM は、ビジネスの集計だけでなく、異常検知やセキュリティの観点でも役に立つ。
後半では、
COUNT / SUM と他の句(GROUP BY など)の関係の入り口、
「全体の件数」と「一部の件数」をどう使い分けるか、
もう少し実務に近い集計例
を扱って、集計の感覚をさらに立体的にしていきます。
