CodeGym /コース /SQL SELF /行数のカウント COUNT()とそのバリエーション

行数のカウント COUNT()とそのバリエーション

SQL SELF
レベル 7 , レッスン 1
使用可能

COUNT()関数は、SQLでめっちゃよく使われるし便利な集約関数のひとつだよ。主な役割は、クエリの結果の行数を数えること。もしCOUNT()関数がSQL界のスーパーヒーローだったら、「こんな質問にすぐ答えられる」っていうスキルを持ってる感じ:

  • 会社で働いてる従業員は何人?
  • 各学部に在籍してる学生の数は?
  • 先月売れた商品の数は?

COUNT()のシンタックスはめっちゃシンプル:

COUNT(カラム名)

ここでカラム名は、カウントしたい列の名前だよ。でも他にも使い方があるから、このレクチャーで詳しく見ていこう。

まずはCOUNT()の一番基本的な使い方から始めよう。

バリエーション1:COUNT(*)で全行をカウントする

テーブルのすべての行を、データが入ってるかどうかに関係なくカウントしたいときはCOUNT(*)を使うよ。アスタリスクは「全カラム」って意味。

例:studentsテーブルがこんな感じだとする:

id name age
1 Otto 20
2 Maria 22
3 NULL 19
4 Anna 21

次のクエリを実行してみよう:

SELECT COUNT(*) 
FROM students;

結果:

count
4

COUNT(*)関数は、個々のカラムにNULLがあっても気にせず、テーブルの行数をそのままカウントするよ。

バリエーション2:COUNT(column)で値が入ってる行だけカウント

でも、特定のカラムにNULLじゃない値が入ってる行だけ数えたいときはどうする?そんなときはCOUNT(column)を使うよ。

例:名前が入ってる学生の数を数えてみよう。

SELECT COUNT(name)
FROM students;

結果:

count
3

違いに気づいた?テーブルには4行あるけど、1行だけnameカラムがNULLになってる。COUNT(column)は、そのカラムがNULLの行は無視するんだ。

COUNT(*)COUNT(column)の比較

じゃあ、COUNT(*)COUNT(column)の違いって何?

  • COUNT(*)は、すべての行をカウントする。どのカラムにNULLがあっても関係なし。
  • COUNT(column)は、指定したカラムがNULLじゃない行だけカウントする。

例のテーブル:

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21

クエリ例:

-- すべての行をカウント
SELECT COUNT(*) FROM students;         -- 4  -- TOTAL (全行)

-- 名前がNULLじゃない行だけカウント
SELECT COUNT(name) FROM students;      -- 3  -- 名前がある行だけカウント

-- 年齢がNULLじゃない行だけカウント
SELECT COUNT(age) FROM students;        -- 3  -- 年齢がある行だけカウント

バリエーション3:COUNT(DISTINCT column)でユニークな値をカウント

たまに、カラムのユニークな値だけ数えたいこともあるよね。たとえば、学生の年齢が何種類あるか知りたいとき。そんなときはCOUNT(DISTINCT column)が便利!

例:

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21
SELECT COUNT(DISTINCT age) FROM students;

結果:

count
3

この場合、DISTINCTは重複だけじゃなくてNULLも無視するよ。

もしCOUNT(*)と一緒にDISTINCTを使おうとするとエラーになるから注意!DISTINCTは特定のカラムにしか使えないよ。

COUNT()の実用例

例1.学生の人数をカウント

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21
SELECT COUNT(*) AS total_students
FROM students;

結果:

total_students
4

例2.年齢がわかってる学生の数をカウント

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21
SELECT COUNT(age) AS students_with_age
FROM students;

結果:

students_with_age
3

例3.ユニークな年齢の数をカウント

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 20
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;

結果:

unique_ages
2

COUNT()を使うときのよくあるミス

COUNT(column)NULLの行もカウントしてくれると思い込むこと。

これは違うよ:COUNT(column)は、そのカラムがNULLの行は無視する。

COUNT(*)でユニークな値をカウントしようとすること。

その場合はCOUNT(DISTINCT column)を使おう。

フィルタリングしたデータをカウントするときにうっかりすること。

例えば:

SELECT COUNT(*) FROM students WHERE age > 20;

この場合、20歳より上の学生だけカウントされる。WHEREで先に行を絞ってからカウントするんだ。

こういう細かい違いでロジックミスしやすいから、気をつけてね!

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION