SQLのCOUNT関数とNULLについて記事にします。
COUNT関数の引数により、NULLを数える場合、数えない場合があるので、その点も踏まえて色々なサンプルSQLでCOUNT関数を紹介します。
<目次>
- COUNT関数とは
- COUNT関数でNULLを数える場合と数えない場合
- 特定のカラム(列)のデータの種類数を求めたい場合
- 間違いやすい「IS NULL」条件を指定した場合のCOUNT
- 特定の列がNULLの行数を調べたい場合
COUNT関数とは
COUNT関数はレコード数(行数)をカウントする関数です。
戻り値は数値型です。
記入例
select count(*) from test_history;
select count(列名) from test_history;
select count(distinct 列名) from test_history;
COUNT関数でNULLを数える場合と数えない場合
COUNT(*)のように*(アスタリスク)を指定した場合は、NULLも含めたテーブルのレコード数(行数)をカウントします。
COUNT(列名)のように列名を指定した場合は、NULLはカウントしません。NULL以外のレコード数(行数)を数えます。
COUNT関数 | 動作 |
---|---|
COUNT(*) |
NULLも集計対象として、行数をカウントする。 |
COUNT(列名) | 指定した列の行数をカウントする。指定した列の値がNULLの行はカウントしない。(NULLは集計対象外) |
以下はSQLのサンプルです。
select count(*) from テーブル名;
→「*」はそのテーブルのNULLも含めた行数をカウントします(NULLも集計対象)
select count(列名) from テーブル名;
→列名を指定した場合は、指定した列の値がNULL以外の行数をカウントする(指定した列の値がNULLの行は集計対象外)
特定のカラム(列)のデータの種類数を求めたい場合
その列のデータの種類の数を求めたいときは、重複した行をまとめるDISTINCTと組み合わせて以下のように使います。
select count(distinct 列名) from テーブル名;
→指定した列のデータの種類数をカウント(NULLは集計対象外)
NULLも1つのデータの種類として数えたい場合は、NVL関数を使用してNULLを別の値に置き換えてカウントします。
select count(NVL(列名,0)) from テーブル名;
→NULLがあれば、NULLも1つのデータの種類として数える。
この例ではNVL関数で「NULL」を「0」に置換して、「0」としてカウントしています。
間違いやすい「IS NULL」条件を指定した場合のCOUNT
以下のようなテーブルがあったとします。
select count(count_b) from test_count where count_b is NULL;
→結果は0になります。
WHERE句でcount_b is NULLとして、COUNT_B列がNULLの条件を指定し、COUNT_Bのレコード数をCOUNT(COUNT_B)で求めています。ただし、COUNT(列名)ではNULLを数えないので0が返ってきます。
select count(id) from test_count where count_b is NULL;
→結果は5になります。
WHEREでcount_b is nullとして、COUNT_B列がNULLの条件を指定。そしてCOUNT関数でID列のレコード数を求めています。COUNT_BがNULLでIDにデータがあるレコード数を返します。
例のテーブルのIDは主キーなので、必ずデータが入っているので、COUNT_B列がNULLのレコード数を求めることができます。
特定の列がNULLの行数を調べたい場合
特定の列が「NULL」の行数を調べたい場合は、以下のような方法があります。
1.COUNT(主キー列)とIS NULLのWHERE条件を組み合わせて求める方法
select count(主キー列) from test_count where NULLのレコード数を求めたいカラム is NULL;
2.COUNT(*)とIS NULLのWHERE条件を組み合わせて求める方法
select count(*) from test_count where NULLのレコード数を求めたいカラム is NULL;
※2.COUNT(*)を使用した場合は1.主キー列を利用した場合よりも処理に時間がかかります。
以上です。