PostgreSQLのCOUNT完全解説!COUNT(*)とCOUNT(column)の違いを初心者向けにやさしく理解
生徒
「データの数を数えたいときにCOUNTを使うって聞いたんですが、書き方がいくつもあって混乱します」
先生
「COUNT(*)とCOUNT(列名)の違いですね。実はここがSQL初心者さんがつまずきやすいポイントなんです」
生徒
「パソコンもあまり触ったことがないんですが、大丈夫でしょうか?」
先生
「大丈夫です。名簿を数える感覚で、一つずつ丁寧に見ていきましょう」
1. SQLとは何か?
SQLは、データベースという「たくさんの情報を整理して保管している箱」に指示を出すための言葉です。学校の名簿や会員リストのような表を、探したり、並べたり、数えたりする作業を、パソコンにお願いするために使います。文字で命令を書くことで、コンピュータが代わりに作業してくれます。
2. PostgreSQLと集約関数の基本
PostgreSQLは、世界中で使われているデータベースソフトです。その中には「集約関数」という便利な仕組みがあります。集約関数とは、たくさんのデータをまとめて計算する機能です。合計を出したり、平均を出したり、そして「件数を数える」こともできます。
COUNTは、その中でも特に使用頻度が高い集約関数です。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
5 | 伊藤美咲 | 27 |
3. COUNT(*)とは何を数えているのか
COUNT(*)は「行の数」を数える命令です。表の中に何行データがあるかを、そのまま数えてくれます。空欄があっても関係ありません。名簿に何人名前が書いてあるかを数えるイメージです。
SELECT COUNT(*)
FROM users;
count
-----
5
この結果は「usersテーブルには5件のデータがある」という意味になります。年齢やメールアドレスが空でも、1行としてカウントされます。
4. COUNT(column)とは何を数えているのか
COUNT(column)は、指定した列に「値が入っている行」だけを数えます。ここがCOUNT(*)との大きな違いです。SQLでは、値が入っていない状態をNULLと呼びます。COUNT(column)は、このNULLを数えません。
SELECT COUNT(email)
FROM users;
count
-----
4
メールアドレスが入っていない行が1件あるため、COUNT(*)より少ない数になります。これは「メールアドレスが登録されている人数」を知りたいときに役立ちます。
5. COUNT(*)とCOUNT(column)の違いを例えで理解
この違いを紙の名簿で例えてみましょう。クラス名簿に5人分の行がある場合、COUNT(*)は「5人います」と答えます。一方で、メールアドレス欄が空白の人が1人いると、COUNT(email)は「メールを書いている人は4人です」と答えます。
つまり、COUNT(*)は行の存在そのものを数え、COUNT(column)は「中身があるかどうか」を見て数えているのです。
6. GROUP BYとCOUNTの組み合わせ
COUNTはGROUP BYと一緒に使うことで、グループごとの件数を数えられます。GROUP BYは「同じ値ごとにまとめる」命令です。年齢ごとに何人いるか、といった集計ができます。
SELECT age, COUNT(*)
FROM users
GROUP BY age;
age | count
----+------
19 | 1
22 | 1
25 | 1
27 | 1
30 | 1
このように、同じ年齢の人が何人いるかを簡単に確認できます。
7. COUNT(column)とGROUP BYの注意点
GROUP BYとCOUNT(column)を組み合わせる場合も、NULLは数えられません。たとえば「年齢ごとのメール登録人数」を調べる場合、メールが未登録の人は集計から外れます。これは間違いではなく、COUNT(column)の正しい動作です。
SELECT age, COUNT(email)
FROM users
GROUP BY age;
8. 初心者が覚えておきたい使い分けの考え方
COUNT(*)とCOUNT(column)は、どちらが良い悪いではありません。「何を数えたいか」で使い分けます。全体の件数を知りたいならCOUNT(*)、特定の項目が入力されている件数を知りたいならCOUNT(column)を使います。目的を先に考えることが、SQLを正しく使う近道です。