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

SQL SQLite
スポンサーリンク

Day10 前半

「行そのもの」ではなく「行の“数”や“合計”を見る」世界に入る

Day9 までは、
どの行を取るか(WHERE)
どの順番で並べるか(ORDER BY)
どれだけ取るか(LIMIT)
をコントロールしてきました。

Day10 からは、視点を少し変えます。
「行そのものを見る」のではなく、「行をまとめて数える・合計する」 という世界です。

ここで登場するのが、集計関数 COUNTSUM
「ユーザーが何人いるか」「売上の合計はいくらか」といった、現実の仕事で超頻出の問いを、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 を組み合わせる

「条件に合う行だけの合計」を出す

SUMCOUNT と同じく、WHERE と組み合わせることで威力を発揮します。

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

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

user_id = 1 の行は、

id=1, amount=1200
id=2, amount=3000

なので、結果は 4200 になります。

SUM(amount)
-----------
4200

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

WHERE で「どの行を対象にするか」を決める。
SUM で、その行たちの amount を合計する。

「対象の行を決めるのは WHERE、集計するのは COUNT / SUM」
という役割分担を、頭の中でハッキリさせておくと理解が一気に楽になります。


COUNT / SUM を使うときの型の重要性

「数える対象」「足し算する対象」が正しい型かを意識する

COUNT(*) は行を数えるので、型はあまり気にしません。
しかし SUM(列名) は、その列が「数値として意味を持つか」がとても重要です。

もし amountTEXT 型で持っていたら、
「文字列としての ‘1000’」を足し算することになり、意図しない結果やエラーの原因になります。

Day3 で学んだ「数値は INTEGER で持つ」という設計が、ここで効いてきます。
「あとで SUM したくなる列は、最初から数値型で定義しておく」
これはテーブル設計の大事な視点です。


セキュリティの視点から見る COUNT / SUM

「全体像をざっくり把握する」ことは、異常検知にもつながる

COUNTSUM は、単なる集計だけでなく、セキュリティ的な「異常検知」にも使われます。

たとえば、

今日のアクセスログの件数(COUNT)が、いつもの10倍になっていないか。
特定ユーザーの購入金額(SUM)が、異常に大きくなっていないか。

こうした「全体像の数字」を見ることで、
「何かおかしいぞ?」という違和感を早くキャッチできます。

Day10 の段階では、
「COUNT / SUM は、“行の集合”を数字に変えて、全体像を見せてくれる道具」
という感覚だけ持っておいてくれれば十分です。


Day10 前半のまとめ

集計関数は、「複数行を1つの値にまとめる」ための関数。
COUNT(*) は行数を数える。WHERE と組み合わせると「条件に合う行が何件か」が分かる。
SUM(列名) は数値列の合計を出す。WHERE と組み合わせると「条件に合う行だけの合計」が分かる。
集計したい列は、最初から数値型で定義しておくことが重要。
COUNT / SUM は、ビジネスの集計だけでなく、異常検知やセキュリティの観点でも役に立つ。

後半では、
COUNT / SUM と他の句(GROUP BY など)の関係の入り口、
「全体の件数」と「一部の件数」をどう使い分けるか、
もう少し実務に近い集計例
を扱って、集計の感覚をさらに立体的にしていきます。

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