MySQLの単一クエリで複数テーブルのNULL値を除外し、NULL以外のレコード数を取得する方法
この記事では、MySQLにおいて単一のクエリを使って、別々の複数テーブルからNULL値を除外し、NULL以外(NOT NULL)のレコード数を取得する方法を解説します。
ポイントは、COUNT(カラム名)を使用することです。COUNT関数にカラム名を指定すると、そのカラムがNULLである行は自動的にカウントから除外されるため、サブクエリを組み合わせることで各テーブルの有効なレコード数を一度に取得できます。
1. 最初のテーブル(DemoTable1)を作成する
まず、CREATE TABLE文で最初のテーブルを作成します。
mysql> create table DemoTable1
-> (
-> Id int
-> );
Query OK, 0 rows affected (1.06 sec)
レコードを挿入する
INSERT文を使って、NULLを含むいくつかのレコードを挿入します。
mysql> insert into DemoTable1 values(1);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1 values(NULL);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1 values(2);
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable1 values(3);
Query OK, 1 row affected (0.13 sec)
テーブルの内容を確認する
SELECT文ですべてのレコードを表示します。
mysql> select * from DemoTable1;
実行結果は以下の通りです。NULLのレコードが1件含まれていることがわかります。
+------+
| Id |
+------+
| 1 |
| NULL |
| 2 |
| 3 |
+------+
4 rows in set (0.00 sec)
2. 2番目のテーブル(DemoTable2)を作成する
続いて、同じ構造を持つ2番目のテーブルを作成します。
mysql> create table DemoTable2
-> (
-> Id int
-> );
Query OK, 0 rows affected (0.65 sec)
レコードを挿入する
こちらにもNULLを含むレコードを挿入します。
mysql> insert into DemoTable2 values(10);
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable2 values(NULL);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2 values(NULL);
Query OK, 1 row affected (0.08 sec)
テーブルの内容を確認する
mysql> select * from DemoTable2;
実行結果は以下の通りです。NULLのレコードが2件含まれています。
+------+
| Id |
+------+
| 10 |
| NULL |
| NULL |
+------+
3 rows in set (0.00 sec)
3. 単一クエリでNULL以外のレコード数を取得する
それでは本題です。以下のように、スカラーサブクエリとしてcount(Id)をそれぞれのテーブルに対して記述することで、1つのSELECT文だけで両テーブルのNULL以外のレコード数を同時に取得できます。
mysql> select
-> (
-> select count(Id) from DemoTable1) as CountFirstTableId,
-> (
-> select count(Id) from DemoTable2) as CountSecondTableId
-> ;
実行結果
+-------------------+--------------------+
| CountFirstTableId | CountSecondTableId |
+-------------------+--------------------+
| 3 | 1 |
+-------------------+--------------------+
1 row in set (0.00 sec)
結果の解説
DemoTable1には4件のレコードがありましたが、そのうち1件がNULLのため、3件とカウントされました。同様にDemoTable2は3件のうちNULLが2件なので、1件とカウントされています。
これは、COUNT(カラム名)がNULL値を自動的に無視してカウントする特性を持つためです。もしNULLも含めてすべての行をカウントしたい場合はCOUNT(*)を使用しますが、今回のように「値が実際に存在するレコードだけを数えたい」場合には、カラム名を指定したCOUNT関数が最適です。UNIONやJOINを使わずにシンプルなSQLで実現できるため、集計処理のパフォーマンス面でも有用なテクニックと言えるでしょう。
-
MySQLでNULLを含む列からNULL以外(NOT NULL)の値だけを抽出して表示する方法
MySQLのIS NOT NULLを使ってNULL以外の値のみを表示するMySQLで、NULLとNULL以外のレコードが混在する列からNULL以外の値だけを取得したい場合は、IS NOT NULL演算子を使用します。この記事では、実際にテーブルを作成しながら手順を解説します。1. テーブルの作成まず、日付型の列を持つサンプルテーブルを作成します。mysql> create table DemoTable1 ( DueDate date ); Query OK, 0 ro
-
MySQLで2つの列のすべての値をカウントし、NULL値を除外する方法
MySQLでは、COUNT関数を組み合わせることで、複数の列に含まれるすべての値をカウントできます。COUNT関数はNULL値を自動的に除外するため、NULLが混在するデータでも正確な合計件数を取得できるのが特徴です。ここでは、2つの列の値をカウントし、NULL値を除外した合計カウントを求める方法を具体的な例で解説します。 1. サンプルテーブルの作成 まず、学生名と点数を格納するテーブルを作成します。 mysql> create table DemoTable1975 ( StudentNa