データ分析に必要な情報を正確に取得する: NULLと非NULLの値のカウント方法
SQLでNULLと非NULLの値を1つのクエリでカウントする方法
SQLでCOUNT関数を使うと、テーブル内のレコード数を簡単にカウントできます。しかし、COUNT関数はNULL値を無視するため、注意が必要です。
このチュートリアルでは、以下の方法について説明します。
- COUNT(*) を使って、NULL値を含むすべてのレコードをカウントする
- CASE式とCOUNT(*) を使って、NULLと非NULLの値を個別にカウントする
以下のサンプルデータテーブル users
を使用します。
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NULL,
email VARCHAR(255) NULL,
PRIMARY KEY (id)
);
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
INSERT INTO users (name, email) VALUES ('Jane Doe', NULL);
INSERT INTO users (name, email) VALUES (NULL, '[email protected]');
SELECT COUNT(*) AS total_records
FROM users;
このクエリは、users
テーブル内のすべてのレコードをカウントし、total_records
という名前の列に結果を表示します。
結果:
total_records
-------------
3
SELECT COUNT(name) AS total_names
FROM users;
total_names
-------------
2
SELECT
COUNT(CASE WHEN name IS NULL THEN 1 END) AS null_names,
COUNT(CASE WHEN name IS NOT NULL THEN 1 END) AS non_null_names
FROM users;
このクエリは、users
テーブルの name
列について、CASE式を使ってNULLと非NULLの値を個別にカウントします。
CASE WHEN name IS NULL THEN 1 END
:name
列がNULLの場合、1を返す
null_names | non_null_names
-------------+-------------
1 | 2
このチュートリアルでは、SQLでNULLと非NULLの値を1つのクエリでカウントする方法について説明しました。
これらの方法を使い分けることで、データ分析に必要な情報を正確に取得することができます。
-- テーブル作成
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NULL,
email VARCHAR(255) NULL,
PRIMARY KEY (id)
);
-- データ挿入
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
INSERT INTO users (name, email) VALUES ('Jane Doe', NULL);
INSERT INTO users (name, email) VALUES (NULL, '[email protected]');
-- すべてのレコード数をカウント
SELECT COUNT(*) AS total_records
FROM users;
-- 特定の列のレコード数をカウント
SELECT COUNT(name) AS total_names
FROM users;
-- NULLと非NULLの値を個別にカウント
SELECT
COUNT(CASE WHEN name IS NULL THEN 1 END) AS null_names,
COUNT(CASE WHEN name IS NOT NULL THEN 1 END) AS non_null_names
FROM users;
-- すべてのレコード数をカウント
total_records
-------------
3
-- 特定の列のレコード数をカウント
total_names
-------------
2
-- NULLと非NULLの値を個別にカウント
null_names | non_null_names
-------------+-------------
1 | 2
解説
上記のコードは、チュートリアルで説明した方法を実際に実行するためのサンプルコードです。
- 最初の
CREATE TABLE
ステートメントは、users
という名前のテーブルを作成します。 - 次の
INSERT INTO
ステートメントは、サンプルデータテーブルに3つのレコードを挿入します。 - 最後の3つの
SELECT
ステートメントは、それぞれ異なる方法でレコード数をカウントします。
実行方法
このコードを実行するには、MySQLなどのデータベース管理システムが必要です。
- データベース管理システムに接続します。
- 上記のコードをコピーして、データベース管理システムのクエリエディタに貼り付けます。
- クエリを実行します。
SQLでNULLと非NULLの値をカウントするその他の方法
IIF関数を使う
SELECT
IIF(name IS NULL, 'NULL', 'NOT NULL') AS name_status,
COUNT(*) AS total_records
FROM users
GROUP BY name_status;
このクエリは、IIF関数を使って name
列の値がNULLかどうかに基づいてレコードをグループ化し、各グループのレコード数をカウントします。
name_status | total_records
-------------+-------------
NULL | 1
NOT NULL | 2
COUNT DISTINCTを使う
SELECT
COUNT(DISTINCT name) AS total_names
FROM users;
このクエリは、COUNT DISTINCT関数を使って、name
列の重複を除いたレコード数をカウントします。
total_names
-------------
2
CASE式とSUMを使う
SELECT
SUM(CASE WHEN name IS NULL THEN 1 ELSE 0 END) AS null_names,
SUM(CASE WHEN name IS NOT NULL THEN 1 ELSE 0 END) AS non_null_names
FROM users;
null_names | non_null_names
-------------+-------------
1 | 2
これらの方法は、それぞれ異なる利点と欠点があります。
- COUNT(*) は最もシンプルですが、NULL値を含まないレコード数をカウントできません。
- COUNT(列名) はNULL値を含まないレコード数をカウントできますが、NULL値を含むレコードがあるかどうかを確認できません。
sql