コマンド道場

$ man count

COUNT

集約関数

行数を数える。数え方が 3 通りあり、NULL の扱いが違う。

呼び出しの形

COUNT(*)
COUNT(式)
COUNT(DISTINCT 式)

つまずきやすいところ

  • COUNT(列) は NULL を数えません。「行数のつもりで列を渡していた」は件数がずれるいちばん多い原因です。行数なら COUNT(*) を使ってください。

  • 1 行も無いときの COUNT(*)0 を返しますが、GROUP BY を付けた場合は行そのものが返りません。「0 件の部署が一覧に出てこない」のはこれが理由で、出したいなら部署表から外部結合します。

  • COUNT(DISTINCT 列) は重複を除くために内部で並べ替えるので、行数が多いと COUNT(*) よりはっきり遅くなります。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

3 つの形を並べて違いを見る
SELECT COUNT(*) AS zen, COUNT(busho_id) AS busho_ari, COUNT(DISTINCT busho_id) AS busho_no_kazu FROM shain
zenbusho_aribusho_no_kazu
18166

1

社員は 18 行。うち 2 人は所属なし(busho_id が NULL)なので COUNT(busho_id) は 16 になります。社員が所属している部署の種類は 6 です(部署表には 7 行ありますが、社員が 0 人の部署は数えられません)。

部署ごとの人数を数える
SELECT busho_id, COUNT(*) AS ninzu FROM shain GROUP BY busho_id ORDER BY busho_id
busho_idninzu
11
24
34
43
52
72
NULL2

7

所属なしの行は busho_id が NULL のグループとしてまとまります。

説明

COUNT3 つの形で意味が変わります。ここを取り違えると、「件数が合わない」の原因になります。

  • COUNT(*)行そのものを数えます。列の中身は見ないので NULL があっても減りません
  • COUNT(列) … その列が NULL でない行だけを数えます
  • COUNT(DISTINCT 列) … NULL を除いたうえで、値の種類を数えます

「全体で何行あるか」を知りたいなら COUNT(*)、「その項目が埋まっている行が何行あるか」を知りたいなら COUNT(列) です。

GROUP BY と組み合わせると、グループごとの件数になります。グループが 1 つも作られない場合(元の行が 0 行)は結果そのものが 0 行になり、0 という値は返りません。

ほかの製品でも通るか

主要 7 製品で通用 そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database / IBM Db2

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報