【MySQL】Where句を使わずに、特定カラムのnull数カウントを行う

MySQL

使いどころはほぼ皆無だけど。

結論

最初に結論を言うと、カウント内でcaseを使うことで実現できた。

count(case when column_name is null then 1 else null end)

手順のおさらい

確認環境

MacBookProで、MySQLバージョンは8.0.18。

$ mysql --version
mysql  Ver 8.0.18 for osx10.15 on x86_64 (Homebrew)

確認手順

あらかじめ言っておくと、手順のおさらいなのでrootユーザーを使用している。

データベースのセッティングする。(新規でDB&テーブル作ってデータを格納するところまで)

root: [(none)] > create database if not exists sample_db;
Query OK, 1 row affected (0.02 sec)

root: [(none)] > use sample_db;
Database changed

root: [sample_db] > create table if not exists user (
    ->     id int(8) not null auto_increment,
    ->     name varchar(100) not null,
    ->     birthday datetime,
    ->     primary key (id)
    -> );
Query OK, 0 rows affected, 1 warning (0.11 sec)

root: [sample_db] > insert into user(name, birthday) values('田中', cast('1990-05-07' as date));
Query OK, 1 row affected (0.02 sec)

root: [sample_db] > insert into user(name, birthday) values('鈴木', cast('1991-07-12' as date));
Query OK, 1 row affected (0.00 sec)

root: [sample_db] > insert into user(name, birthday) values('佐藤', null);
Query OK, 1 row affected (0.01 sec)

データが入っていることを確認する。

root: [sample_db] > select * from user;
+----+--------+---------------------+
| id | name   | birthday            |
+----+--------+---------------------+
|  1 | 田中   | 1990-05-07 00:00:00 |
|  2 | 鈴木   | 1991-07-12 00:00:00 |
|  3 | 佐藤   | NULL                |
+----+--------+---------------------+
3 rows in set (0.00 sec)

カウントを実行する。

root: [sample_db] > select
    -> count(id) as total,
    -> count(birthday) as birth_count,
    -> count(case when birthday is null then 1 else null end) as birth_null_count
    -> from user;
+-------+-------------+------------------+
| total | birth_count | birth_null_count |
+-------+-------------+------------------+
|     3 |           2 |                1 |
+-------+-------------+------------------+
1 row in set (0.00 sec)

各countの簡単な説明

count(id) as total

idカラムをカウント。
not nullのauto_increment(絶対に何かしら値が入る主キー)なので、全レコード数が取得。

count(birthday) as birth_count

birthdayカラムがnullでないものだけカウント。(count関数はnullをカウント対象外にするため)

count(case when birthday is null then 1 else null end) as birth_null_count

birthdayカラムがnullのものだけカウント。
「birthdayカラムがnullの場合1、それ以外の場合0」という条件式でカウントをとっているため。

雑感

where句使えば一発で解決するのに、なにをやっているんだ…。
徒労っていうのはこういうことを指すんでしょうねぇ。

とはいえ、caseを使ったのは初なので勉強になりました。
SQLって柔軟に構文を組めて、本当に便利ですね。

コメント

タイトルとURLをコピーしました