SQLでテーブルの行数を調べるときにはCOUNT関数を使用すます。
テーブルに格納されているデータの件数を調べたり、特定の条件に一致するレコードの件数を調べたり、さまざまなシーンで利用します。
この記事では、SQLのCOUNT関数を使って、データベース・テーブルの件数を取得する方法について解説します。
目次
COUNT関数
SQLのCOUNT関数は、その名の通り、テーブルのレコード数を数える関数です。
COUNT関数の構文は次のようになっています。
COUNT(式)
引数の式には、行数を取得する列名(カラム名)や条件式を指定します。また*(アスタリスク)を指定すると、すべてのレコードの行数をカウントします。
では、COUNT関数を使って行数を数える例を、いくつか見ていきましょう。
テーブルの行数(レコード数)を数える
まず最も簡単な例である、COUNT(*)でテーブルの行数(レコード数)を数える方法を紹介します。
scoresテーブルには、次のデータが格納されている例で解説します。
Id | name | score |
---|---|---|
1 | Yamada | 100 |
2 | Suzuki | 80 |
3 | Tanaka | (NULL) |
4 | Sato | 90 |
5 | Hayashi | 90 |
テーブルの行数を数える場合は、FROM句に行数を数えたりテーブル名を指定してCOUNT関数を使用します。
SELECT COUNT(*) FROM scores
(実行結果)
COUNT
----------
5
列名を指定して行数(レコード数を)数える
COUNT関数の引数に、列名(カラム名)を指定して行数を数えることもできます。
列名を指定してCOUNT関数を実行すると、指定した列の値でNULLを除いた行数が取得できます。
先ほどの例に続き、scoresテーブルには、次のデータが格納されている例で解説します。
Id | name | score |
---|---|---|
1 | Yamada | 100 |
2 | Suzuki | 80 |
3 | Tanaka | (NULL) |
4 | Sato | 90 |
5 | Hayashi | 90 |
では、score列を引数に指定して、COUNT関数を実行してみましょう。
SELECT COUNT(score) FROM scores
(実行結果)
COUNT
----------
4
scoresテーブルには全部で5レコードのデータが登録されていますが、score列には1件NULLのデータが存在しているため、NULLを除いた4件の行数がカウントされます。
DISTINCTを指定して重複行を除外
COUNT関数の引数に、COUNT(DISTINCT 列名)のように、DISTINCTキーワードを使用すると、重複した行を取り除いた上で、行数をカウントすることができます。
scoresテーブルのcity列に対し、重複を除いた行数をカウントしてみましょう。
Id | name | city | score |
---|---|---|---|
1 | Yamada | Tokyo | 100 |
2 | Suzuki | Tokyo | 80 |
3 | Tanaka | Osaka | (NULL) |
4 | Sato | Osaka | 90 |
5 | Hayashi | Nagoya | 90 |
COUNT関数の引数に、DISTINCTキーワードを指定して、SQLを実行します。
SELECT COUNT( DISTINCT city ) FROM scores
(実行結果)
COUNT
----------
3
上の実行結果のように、scoresテーブルのcity列の重複データが取り除かれ、結果が3件になっていることが分かります。
DISTINCTキーワードを使用する際、NULL のデータが存在していた場合、結果はどうなるでしょうか?実際に試してみましょう。
scoresテーブルのcity列にNULLのデータを設定します。
Id | name | city | score |
---|---|---|---|
1 | Yamada | Tokyo | 100 |
2 | Suzuki | Tokyo | 80 |
3 | Tanaka | (NULL) | (NULL) |
4 | Sato | (NULL) | 90 |
5 | Hayashi | Nagoya | 90 |
先ほどのSQLと同様に、COUNT関数の引数に、DISTINCTキーワードを指定して、SQLを実行します。
SELECT COUNT( DISTINCT city ) FROM scores
(実行結果)
COUNT
----------
2
結果は「2」となりました。
これは、NULLを除外データで、DISTINCTキーワードで重複した行が取り除かれるため、「Tokyo」と「Nagoya」のデータでカウントされているためです。
GROUP BYとCOUNT関数を使った集計
指定したカラムや式を条件に、データをグループ化するGROUP BYとCOUNT関数を組み合わせて使用することで、グループ毎のデータ件数を集計できます。
では、scoresテーブルのcity列毎の行数(レコード数)を求める例で見ていきましょう。
Id | name | city | score |
---|---|---|---|
1 | Yamada | Tokyo | 100 |
2 | Suzuki | Tokyo | 80 |
3 | Tanaka | Osaka | (NULL) |
4 | Sato | Osaka | 90 |
5 | Hayashi | Nagoya | 90 |
SQLは次のように、GROUP BYにcity列を指定してグループ化し、COUNT関数でグループ毎の行数(レコード数)を求めます。
SELECT city, COUNT(id) FROM scores GROUP BY city
(実行結果)
city COUNT
--------------
Tokyo 2
Osaka 2
Nagoya 1
GROUP BYを使用すうるとこで、上の結果のようにグループ毎に行数が求められました。
これを応用すれば、さまざま観点でのデータ集計ができます。
例えば、男女別の人数を数えたり、ゲームランク別のユーザー数を求めたりと、データの分析はビジネスにおいて非常に重要な役割があるため、是非覚えておきましょう。
大量データをカウントする時
データベースのテーブルに、億を超えるような行(レコード)が登録されているテーブルの場合、テーブルの件数をCOUNT関数で取得するだけでも、時間がかかることがあります。
単純にテーブルに登録されているデータの、総行数が知りたいだけであれば、統計情報から確認することで、高速に調べることができます。
MySQLであれば、次のSQLのようにINFORMATION_SCHEMAスキーマからテーブルのメタデータを確認するとこで、テーブルの行数(レコード数)を確認できます。
select table_name, table_rows from information_schema.TABLES
ただし、INFORMATION_SCHEMAスキーマから取得できるのは、あくまでメタデータであるため、メタデータが更新されていない場合、実際のテーブルに登録されている行数と異なる可能性があります。
INFORMATION_SCHEMAスキーマから取得できる情報は、あくまで参考情報であるため、正確な行数が求められるシーンや、実際のアプリケーション開発では使用しないほうがよいでしょう。
まとめ
SQLでテーブルの行数を調べる時に使用するCOUNT関数の使い方について解説してきました。
COUNT関数、SUMなどの集計関数は、業務システム開発・ゲーム開発など、どのようなシステムであっても、非常に多くのシーンで利用される関数です。
SQLは、テーブルからデータを抽出するだけでなく、集計、累積などのデータ分析などが行える強力な言語ですので、是非覚えておきましょう。
このように、COUNT関数の引数に列名を指定すると、NULLの行はカウント対象外になるため、単純にテーブルのレコード数だけを調べる用途で使用するときには注意が必要です。