データベース処理で、テーブルから取得したレコードの件数を知りたい場合には「COUNT関数」を利用することが可能です。
本記事では、COUNT関数の使い方についてサンプルコードを交えながら詳しく解説していきます。
目次
SQLでレコード件数を取得するCOUNT関数の使い方
まずはSQLでレコード件数を取得するために利用されるCOUNT件数の使い方について確認してみましょう。
基本構文
COUNT関数の記述方法は下記の通りです。
SELECT COUNT(カラム名) FROM テーブル名;
サンプル
サンプルとして「member」テーブルを作成し、下記のデータを用意しました。
+------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | | 3 | 山田あかね | チーム3 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+-----------------+------------+
実際にCOUNT関数を指定して取得結果を確認してみましょう。
mysql> select count(*) from member; +----------+ | count(*) | +----------+ | 7 | +----------+ 1 row in set (0.05 sec)
カラム名に全てのカラムを意味する「*」を指定した結果、テーブルのレコード数が取得出来ていることをご確認頂けます。
SQLでレコード件数を取得する際の注意点
上述したようにCOUNT関数を利用すれば簡単にレコードの件数を取得することが可能ですが、注意しておかなければならないポイントがあります。
NULLデータを含んだカラムが存在する場合、指定するカラムによって取得結果が変わってしまうためです。
NULLを含んだカラム名の指定
まずはNULLを含んだカラム名をCOUNT関数の引数にして処理を実施してみましょう。
mysql> select count(name) from member; +-------------+ | count(name) | +-------------+ | 6 | +-------------+ 1 row in set (0.01 sec)
取得結果が「*」を指定した場合と異なり、NULLデータのレコードを除いた件数が表示されていることをご確認頂けます。
NULLを含まないカラム名の指定
ではNULLを含まないカラム名をCOUNT関数の引数に指定した場合、どのような結果が取得出来るのでしょうか。
mysql> select count(id) from member; +-----------+ | count(id) | +-----------+ | 7 | +-----------+ 1 row in set (0.00 sec)
NULLのデータが存在しないカラムの場合、テーブルに存在するレコード全件の件数が返却されていますね。
SQLのレコード件数を様々な条件で取得してみよう
COUNT関数による基本的なレコード件数の取得方法は確認出来ましたので、次に応用編ということで様々な条件での取得にチャレンジしていきたいと思います。
グループ化して件数を取得する
上記サンプルの場合、チーム毎に何件のデータがあるのか確認したいケースは良くあります。
グループ化して件数を取得したい場合には「GROUP BY句」を利用することが可能です。
実際にチーム名毎にグループ化して表示するサンプルSQLを掲載します。
mysql> select team_name, count(team_name) from member group by team_name; +------------+------------------+ | team_name | count(team_name) | +------------+------------------+ | チーム1 | 3 | | チーム2 | 2 | | チーム3 | 1 | | NULL | 0 | +------------+------------------+ 4 rows in set (0.00 sec)
ちなみにNULLの件数も確認したい場合にはCOUNT関数の引数に「*」を指定します。
mysql> select team_name, count(*) from member group by team_name; +------------+----------+ | team_name | count(*) | +------------+----------+ | チーム1 | 3 | | チーム2 | 2 | | チーム3 | 1 | | NULL | 1 | +------------+----------+ 4 rows in set (0.00 sec)
重複レコードを除いた件数を取得する
指定したカラムに何種類のデータが格納されているのか知りたいケースも存在します。
重複レコードを取り除いて件数を確認するには「DISTINCT」を組み合わせることで実現可能です。
mysql> select count(distinct team_name)from member; +---------------------------+ | count(distinct team_name) | +---------------------------+ | 3 | +---------------------------+ 1 row in set (0.01 sec)
NULLを除いた上で、重複データを削除した件数が表示されています。
条件を指定して件数を比較する
例えばサンプルの場合、チーム1のデータとチーム2のデータがそれぞれ何件なのかを確認したいケースは良くあります。
COUNT関数の引数には条件式を記述することが出来るため、下記のように記述することで実現可能です。
mysql> select count(team_name="チーム1" or NULL), count(team_name="チーム2" or NULL)from member; +---------------------------------------+---------------------------------------+ | count(team_name="チーム1" or NULL) | count(team_name="チーム2" or NULL) | +---------------------------------------+---------------------------------------+ | 3 | 2 | +---------------------------------------+---------------------------------------+ 1 row in set (0.01 sec)
「OR NULL」ってなんだと疑問に思いますよね。
「OR NULL」を入力せずにSQLを実行してみましょう。
mysql> select count(team_name="チーム1"), count(team_name="チーム2")from member; +-------------------------------+-------------------------------+ | count(team_name="チーム1") | count(team_name="チーム2") | +-------------------------------+-------------------------------+ | 6 | 6 | +-------------------------------+-------------------------------+ 1 row in set (0.00 sec)
COUNT関数では「NULL以外の値を保持するレコード」の件数を取得するようで、「team_name=”チーム1″」の条件式の答えは「TRUE」か「FALSE」にしかなりません。
つまりCOUNT関数の考え方では結果がどちらであってもNULL以外の値なので、件数の取得対象になるんですね。
「OR NULL」を付けることにより、「条件式に一致するまたはNULLのデータ」が取得条件に変わります。
上記の結果からCOUNT関数はNULLの値をカウント対象として除外するため、結果的に条件式で「TRUE」となったデータだけが件数として表示される仕組みです。
さいごに:SQLのCOUNT関数を利用してレコード件数を取得してみよう!
本記事では、SQLのCOUNT関数を利用したレコード件数の取得方法について確認してきました。
COUNT関数の使い方自体は簡単ですが、NULL値の取り扱いにだけは気をつける必要があります。
NULL値を含んだ件数が取得したいのか、NULL以外のデータ件数が取得したいのか意図をはっきりさせた上で利用するようにしましょう。
ちなみに「*」を指定した場合、全てのカラムデータがNULLの場合でも、レコードが存在していれば件数としてカウントされます。