SQL COUNT 関数について調べてみた

2024.04.30

こんにちは!よしななです。
業務中に SQL のCOUNT集計関数を使う機会があったのですが、挙動についてわからない部分があったので備忘録としてまとめます。

目次

  • 実行環境
  • COUNT 関数とはなにか
  • COUNT 関数使用例
  • かっこの中身について
    • COUNT(*)
    • COUNT(1)
    • COUNT(カラム名)
    • COUNT(DISTINCT カラム名)
  • WHERE を使用し、条件をつけて COUNT してみる

実行環境

本記事では、Amazon Athena で SQL を実行しています。
以下の .jsonl データを Amazon S3 にアップロード済みです。

employee.jsonl

{"ID": 1, "employee_name": "山田太郎", "department": "sales", "age": 30}
{"ID": 2, "employee_name": "佐藤花子", "department": "manager", "age": 25}
{"ID": 3, "employee_name": "田中一郎", "department": null, "age": 22}
{"ID": 4, "employee_name": "伊藤美咲", "department": "engineer", "age": 27}
{"ID": 5, "employee_name": "渡辺健", "department": "manager", "age": 35}
{"ID": 6, "employee_name": "小山裕太", "department": "sales", "age": 29}
{"ID": 7, "employee_name": "吉川美波", "department": "engineer", "age": 25}
{"ID": 8, "employee_name": "井上俊", "department": "engineer", "age": 37}

上記 .jsonl データは ChatGPT を使用して生成しています。

上記 .jsonl データをもとにCREATE TABLEを実行し、Amazon Athena 上にemployee_usersテーブルを作成しています。
CREATE TABLE手順は こちらの記事 を参考にしてください。

COUNT 関数とはなにか

COUNT関数とは SQL 集計関数の一つで、レコード数を数えるために使用します。
使い方の例は以下の通りです。

SELECT COUNT(column_name)
FROM table_name
WHERE condition;
  • column_name
    • カウントする行の中で特定の列を指定します。
  • table_name
    • データを抽出するテーブルの名前を指定します。
  • WHERE
    • 特定の条件を満たす行のみをカウントしたい場合にconditionWHEREで指定します。
    • 特に条件が無い場合は、WHEREは不要です。

COUNT 関数使用例

例えば、ユーザーデータが格納された、userテーブルがあります。

userテーブルに含まれるレコードの数を数えたいときに、COUNT関数を使用します。
以下の SQL クエリを Amazon Athena で実行すると…

SELECT COUNT(*) AS department
FROM employee_users;

employee_usersテーブルのレコードは8行あるので、以下の通り8が返ります。

COUNT 関数の () の中身について

COUNT関数の構文を調べるために、ドキュメントや色々なサイトを参考にしていたのですが、COUNT()の構文が複数あり、混乱したのでそれぞれの挙動についてまとめておきます。

COUNT(*)

このパターンはテーブルのすべての行をカウントします。
NULLの値を持つ行も含めてテーブル内の全ての行がカウントされます。
テーブルに含まれるレコードの総数を知りたい時に便利です。

SELECT COUNT(*) AS department
FROM employee_users;

employee_usersテーブルは8行あるので、下記の通り8が返ります。

COUNT(1)

こちらのパターンもテーブルのすべての行をカウントします。
NULLの値を持つ行も含めてテーブル内の全ての行がカウントされます。
テーブルに含まれるレコードの総数を知りたい時に便利です。

SELECT COUNT(1) AS department
FROM employee_users;

employee_usersテーブルは8行あるので、下記の通り8が返ります。

COUNT(カラム名)

このパターンでは指定されたカラム内の値をカウントします。
NULL値はカウントされません。
特定のカラムに対する非NULLの値の数がどれだけあるかを知りたい場合に便利です。

SELECT COUNT(department) AS department
FROM employee_users;

employee_usersテーブルのdepartmentカラムにはNULL1行含まれるため、NULLレコードを抜いた7が返ります。

COUNT(DISTINCT カラム名)

このパターンは指定されたカラム内の異なる(ユニークな)値の数をカウントします。
重複する値は一つとしてカウントされ、ユニークな値のみがカウントの対象になります。
特定のカラム内にどれだけのユニークな値が存在するかを知りたい時に便利です。

SELECT COUNT(DISTINCT department) AS department
FROM employee_users;

employee_usersテーブルのdepartmentカラムにはsales,manager,engineerの3つがユニークな値として登録されているため、下記の通り3が返ります。

WHERE を使用し、条件をつけて COUNT してみる

WHERE句を使用して、特定の条件を満たす行のみをCOUNTすることができます。
employee_usersテーブルのsalesが何人いるかを数えたい場合、カラム名 = 絞り込みたい文字列(今回は sales)で絞り込みができます。

SELECT COUNT(*) AS sales
FROM employee_users
WHERE department = 'sales';

departmentカラムにはsalesが2レコードあるので、下記の通り2が返ります。

上記の通り、COUNT関数を使用して様々な条件でレコードのカウントができます。
ここまで読んでいただきありがとうございました!