【SQL】count(*)とcount(列名)のちょっとした違い

データ件数の確認をする際にSQLの「count」を用いると思います。
count()の中を*にするのか列名にするのかで若干件数が変わる場合があります。
初歩的なことですが、意外と忘れがちなので検証してみます。

検証

件数確認

実際にデータを用意して、検証してみたいと思います。
(DBはPostgreSQLを利用してます)

以下のようなデータを準備します。

idcd
11
21
3NULL
42
53
63

SQLを実行して件数がどうなるかを確認してみます。

select count(*) as アスタ, count(cd) as 列名 from sample;

するとどうなるかというと

若干件数が違いますね。列名を指定した場合は、NULLが含まれていません。
アスタリスクを指定した場合はレコード件数全ての7件となっています。
NULLのレコード1件分違いがでています。

group by利用

group byを利用して再度確認してみたいと思います。

select cd, count(*) as アスタ, count(cd) as 列名 from sample group by cd order by cd;

すると

アスタリスクを指定した場合はNULLの件数が含まれています。
列名を指定した場合は0件となっています。ここからもNULLのレコードは列名指定しないとカウントされないということがわかります。

補足

PostgreSQLでは「空」と「NULL」の値を区別します。
空のレコードを1件追加し、確認してみます。

select count(*) as アスタ, count(cd) as 列名 from sample;

group byを利用

select cd, count(*) as アスタ, count(cd) as 列名 from sample group by cd order by cd;

空の値はアスタリスクでも列名でもカウントするようです。

最後に

初歩的なものでもSQLはちょっとした罠があります。
(以前この違いが分かっていなくて、注意されたことがあります)
他にも意外と見落としがちなポイントがあると思いますので注意しましょう。

参考文献

PostgreSQL 13.1文書
タイトルとURLをコピーしました