この記事は、Qiita株式会社のカレンダー | Advent Calendar 2023 - Qiitaの11日目の記事です。
そもそもCOUNT関数とは?
ほとんどの方は知っていると思ういますが、一応説明をしておきます。
COUNT関数とは、SQLの集約関数の一つで指定したカラムのレコード数を調べる時に用いたりします。
カッコの中身について
COUNTの中身が1
だったり、*
だったり、カラム名
だったり
現場においてもまちまちですよね。
例を出して説明していきます
下記のようなテーブルがあった際に
user テーブル
user_id | user_name |
---|---|
1 | taro |
2 | NULL |
3 | taro |
SELECT COUNT(*) FROM user
+----------+
| count(*) |
+----------+
| 3 |
+----------+
COUNT(*)
とすることで、全体のレコード数を計算することをができます
SELECT COUNT(user_name) FROM user
+------------------+
| count(user_name) |
+------------------+
| 2 |
+------------------+
COUNT(user_name)
とすることで、user_name
がNULLの場合を除いた
レコード数を取得できます。
COUNT(1)
の場合はどうなるでしょうか
SELECT COUNT(1) FROM user
+----------+
| count(*) |
+----------+
| 3 |
+----------+
重複回避のDISTINCT
もまとめるとこんな感じ
列名 | 件数 | 内容 |
---|---|---|
COUNT(*) | 3 | NULL含めた件数 |
COUNT(user_name) | 2 | NULLを除いたuser_nameの件数 |
COUNT(DISTINCT user_name) | 1 | NULLを除いたuser_nameをユニークとした件数 |
COUNT(1) | 3 | NULLを含めた件数 |
見ての通り、COUNT(*)
とCOUNT(1)
の実行結果が一緒になります。
じゃあCount(1)とCount(*)何が違うの?
COUNT(*) はデータベースエンジンに対して「すべての列をカウントする」という指示を出します。
そのため、行の存在そのものを数えるのでNULLであってもカウント対象になります。
じゃあCOUNT(カラム名)
は何なのかというと、指定されたカラムに有効な値がセットされているものの行数が返ります。
もっというと、カラムがNULLじゃないものの行数です。
それを頭に入れて以下を見て見ましょう
COUNT(1)
COUNT(1) は「1という値が存在する行をカウントする」という指示になります。
select 1 from user
のデータ件数となり、
1 |
---|
1 |
1 |
1 |
のようにNULLじゃないレコードが3件のためCOUNT(*)
とCOUNT(1)
が同じ実行結果になります。
おまけ
ここまで見てもわからない人でも人でも以下を見ればわかるはず...!
SELECT 'takashi' FROM user
SELECT COUNT('takashi') FROM user
'takashi' | COUNT('takashi') |
---|---|
SELECTされた3件全て、'takashi' IS NOT NULL
の条件に当てはまるのでCOUNT関数
で出力される件数は3になります!
SELECT NULL FROM user
SELECT COUNT(NULL) FROM user
NULL | COUNT(NULL) |
---|---|
SELECTされた3件全て、NULL IS NOT NULL
の条件に当てはまらないのでCOUNT関数
で出力される件数は0になります!
おわりに
今回はCOUNT関数とその中身について、自分の備忘録も兼ねてまとめさせて頂きました。
例題もいくつか出したので視覚的にも理解できたかなと思います。
より、COUNT関数に詳しい方がいれば性能面含めて、編集リクエストやコメント頂けると嬉しいです...!
参考文献