MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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 = ''」に変更すれば対応できます。目的に応じて使い分けるとよいでしょう。

  1. MySQLのCOUNT(DISTINCT)処理が遅い原因と、インデックスを使った高速化の方法

    MySQLのCOUNT(DISTINCT)を高速化するにはインデックスが有効MySQLでCOUNT(DISTINCT)を実行した際に処理が遅くなる場合は、対象カラムにINDEX(インデックス)を作成することで大幅に高速化できます。ここでは、複合インデックスを設定したテーブルを作成し、実際にCOUNT(DISTINCT)クエリを実行する手順を解説します。1. インデックス付きテーブルを作成するまず、FirstNameとLastNameの2つのカラムに複合インデックスを設定したテーブルを作成します。mysql> create table DemoTable1905 ( Fir

  2. 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を含む複数のレコードを