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の扱いが重要な場面でぜひ活用してください。
-
MySQLで3つの列から重複しない値を抽出し、1つの列にまとめて表示する方法
MySQLでは、1つのクエリ内で UNION を複数回使うことで、複数の列に分かれている値を縦方向に結合し、重複を除いた値を1つの列として取得できます。本記事では、実際のテーブル作成からデータ挿入、そして目的の結果を得るまでの手順を順番に解説します。 サンプルテーブルの作成 まずは、3つの整数型の列を持つテーブルを作成します。 mysql> create table DemoTable -> ( -> Value1 int, -> Value2 int, -> Value3 int -> ); Query OK, 0
-
MySQLのGROUP_CONCAT・CONCAT・DISTINCTを使って単一カラムの値を引用符で囲む方法
MySQLで単一カラム内のカンマ区切りの値を、それぞれ引用符(シングルクォート)で囲んだ形式に変換したい場合は、GROUP_CONCAT()とREPLACE()、さらにCONCAT()を組み合わせることで実現できます。ここでは、実際の例を使って手順を詳しく解説します。 テーブルの作成 まずはサンプルとなるテーブルを作成しましょう。 mysql> create table DemoTable1799 ( EmployeeId varchar(20) ); Query OK, 0 rows affected