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

MySQLの単一クエリでNULLの件数・0の件数・それらを除く値の種類数を同時にカウントする方法

MySQLでは、sum() 関数と count(distinct) を組み合わせることで、1つのクエリだけで「NULLの件数」「0の件数」「NULLと0を除いた値の種類数」を同時に取得できます。この記事では、実際にテーブルを作成して動作を確認する手順を解説します。

1. サンプルテーブルの作成

まず、カウント対象となるテーブルを作成します。

mysql> create table DemoTable(
    Value int
);
Query OK, 0 rows affected (1.35 sec)

2. テストデータの挿入

insertコマンドを使って、数値・0・NULLが混在するレコードを挿入します。

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values(NULL);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.59 sec)
mysql> insert into DemoTable values(0);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.70 sec)
mysql> insert into DemoTable values(0);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(NULL);
Query OK, 1 row affected (0.16 sec)

3. 挿入したレコードの確認

select文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。合計8行のうち、「10」が3件、「20」が1件、「0」が2件、「NULL」が2件含まれていることがわかります。

+-------+
| Value |
+-------+
| 10    |
| NULL  |
| 10    |
| 0     |
| 20    |
| 10    |
| 0     |
| NULL  |
+-------+
8 rows in set (0.00 sec)

4. 単一クエリで各件数をカウントする

ここが本題です。次のクエリを実行すると、NULLの件数・0の件数・NULLと0を除いた値の種類数を一度に取得できます。

mysql> select sum(Value is null) as NumberOfNull,
   sum(Value=0) as NumberOfZero,
   count(distinct Value > 0) as ValueExceptZeroAndNull
from DemoTable;

実行結果

+--------------+--------------+------------------------+
| NumberOfNull | NumberOfZero | ValueExceptZeroAndNull |
+--------------+--------------+------------------------+
| 2            | 2            | 2                      |
+--------------+--------------+------------------------+
1 row in set (0.00 sec)

5. クエリの仕組みの解説

  • sum(Value is null):条件式は真の場合に1、偽の場合に0を返すため、その合計がNULLの件数になります。ここでは「2」と出力されています。
  • sum(Value=0):同じ仕組みで、値が0であるレコードの件数を返します。結果は「2」です。
  • count(distinct Value > 0):値が0より大きいかどうか(TRUE / FALSE / NULL)を重複なくカウントします。NULLはCOUNTの対象外になるため、正の値のみが集計され、結果は「2」(10と20の2種類)となります。

このように、条件式をsum()やcount(distinct)に渡すテクニックを使えば、複数回のクエリを発行することなく、1回のSQLで多様な集計結果を効率的に取得できます。ログ解析やデータ品質チェックなど、NULLや0の扱いが重要な場面でぜひ活用してください。

  1. MySQLで3つの列から重複しない値を抽出し、1つの列にまとめて表示する方法

    MySQLでは、1つのクエリ内で UNION を複数回使うことで、複数の列に分かれている値を縦方向に結合し、重複を除いた値を1つの列として取得できます。本記事では、実際のテーブル作成からデータ挿入、そして目的の結果を得るまでの手順を順番に解説します。 サンプルテーブルの作成 まずは、3つの整数型の列を持つテーブルを作成します。 mysql> create table DemoTable -> ( -> Value1 int, -> Value2 int, -> Value3 int -> ); Query OK, 0

  2. MySQLのGROUP_CONCAT・CONCAT・DISTINCTを使って単一カラムの値を引用符で囲む方法

    MySQLで単一カラム内のカンマ区切りの値を、それぞれ引用符(シングルクォート)で囲んだ形式に変換したい場合は、GROUP_CONCAT()とREPLACE()、さらにCONCAT()を組み合わせることで実現できます。ここでは、実際の例を使って手順を詳しく解説します。 テーブルの作成 まずはサンプルとなるテーブルを作成しましょう。 mysql> create table DemoTable1799     (     EmployeeId varchar(20)     ); Query OK, 0 rows affected