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で先に行を絞ってからカウントするんだ。
こういう細かい違いでロジックミスしやすいから、気をつけてね!
GO TO FULL VERSION