MySQLでNULL値をカウントする方法を実例付きでわかりやすく解説
MySQLでNULL値をカウントする方法
MySQLでテーブル内のNULL値の件数を調べるには、CASE文とSUM関数を組み合わせるのが一般的です。COUNT関数はNULLを除外して数えてしまうため、NULLを正しくカウントしたい場合にはこの方法が有効です。
まず、動作確認用のサンプルテーブルを作成しましょう。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(20)
);
Query OK, 0 rows affected (0.77 sec)
次に、INSERTコマンドでレコードを挿入します。ここでは、通常の文字列に加えてNULLと空文字列('')を意図的に混ぜて登録しています。
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values(null);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable(FirstName) values('');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(FirstName) values('Larry');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(FirstName) values('');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(FirstName) values(null);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(FirstName) values(null);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName) values('Bob');
Query OK, 1 row affected (0.15 sec)
SELECT文でテーブル内の全レコードを確認してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | John | | 2 | NULL | | 3 | | | 4 | Larry | | 5 | | | 6 | NULL | | 7 | NULL | | 8 | Bob | +----+-----------+ 8 rows in set (0.00 sec)
このように、テーブルには「NULL」と表示される行と、空文字列('')だけの行が混在しています。NULLと空文字列は別のものとして扱われるため、この違いを意識しておくことが重要です。
NULL値をカウントする基本クエリ
それでは、NULL値をカウントするクエリを見ていきましょう。CASE文でFirstNameがNULLの場合は「1」、それ以外は「0」を返すようにし、その合計をSUM関数で求めます。
mysql> select sum(case when FirstName IS NULL then 1 else 0 end) as NUMBER_OF_NULL_VALUE from DemoTable;
実行結果:
+----------------------+ | NUMBER_OF_NULL_VALUE | +----------------------+ | 3 | +----------------------+ 1 row in set (0.00 sec)
この結果から、FirstNameカラムに含まれるNULL値は3件であることが確認できます。
補足:NULLを数える別のアプローチ
COUNT(*)は全行数を、COUNT(カラム名)はNULL以外の行数をカウントします。この性質を利用すれば、以下のように全行数からNULL以外の行数を引いてNULLの件数を求めることも可能です。
mysql> select count(*) - count(FirstName) as NUMBER_OF_NULL_VALUE from DemoTable;
また、空文字列('')もあわせてカウントしたい場合は、CASE文の条件を「FirstName IS NULL OR FirstName = ''」に変更すれば対応できます。目的に応じて使い分けるとよいでしょう。
-
MySQLのCOUNT(DISTINCT)処理が遅い原因と、インデックスを使った高速化の方法
MySQLのCOUNT(DISTINCT)を高速化するにはインデックスが有効MySQLでCOUNT(DISTINCT)を実行した際に処理が遅くなる場合は、対象カラムにINDEX(インデックス)を作成することで大幅に高速化できます。ここでは、複合インデックスを設定したテーブルを作成し、実際にCOUNT(DISTINCT)クエリを実行する手順を解説します。1. インデックス付きテーブルを作成するまず、FirstNameとLastNameの2つのカラムに複合インデックスを設定したテーブルを作成します。mysql> create table DemoTable1905 ( Fir
-
MySQLでNULL値を1として表示・更新する方法
MySQLでは、テーブル内のNULL値を別の値(たとえば「1」)に置き換えて扱いたい場面があります。この記事では、IFNULL関数とUPDATE文を組み合わせて、NULL値を1に変換する具体的な手順をサンプルコード付きで解説します。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成します。 mysql> create table DemoTable1963 ( Counter int ); Query OK, 0 rows affected (0.00 sec) 2. レコードを挿入する INSERT文を使って、NULLを含む複数のレコードを