MySQLクエリでCASE条件を使ってカウントする方法
MySQLでは、CASE WHENを活用し、COUNT()関数の中にCASE条件を設定することで、特定の条件に一致するレコードだけを数えることができます。
この仕組みが成り立つのは、COUNT()関数がNULL値を無視するためです。条件に合わない場合にNULLを返すことで、そのレコードはカウント対象から除外されます。
1. サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable1374
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20),
-> Score int
-> );
Query OK, 0 rows affected (0.61 sec)2. レコードの挿入
続いて、insertコマンドを使ってテーブルにデータを登録します。
mysql> insert into DemoTable1374(Name,Score) values('Chris',45);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1374(Name,Score) values('David',78);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1374(Name,Score) values('Bob',45);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1374(Name,Score) values('Mike',75);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1374(Name,Score) values('Carol',45);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1374(Name,Score) values('Adam',89);
Query OK, 1 row affected (0.18 sec)3. データの確認
select文を実行して、テーブル内の全レコードを表示してみましょう。
mysql> select * from DemoTable1374;
実行すると、以下のような結果が得られます。
+----+-------+-------+ | Id | Name | Score | +----+-------+-------+ | 1 | Chris | 45 | | 2 | David | 78 | | 3 | Bob | 45 | | 4 | Mike | 75 | | 5 | Carol | 45 | | 6 | Adam | 89 | +----+-------+-------+ 6 rows in set (0.00 sec)
4. CASE WHENとCOUNTを組み合わせた集計
以下が、CASE WHENで条件を設定し、Scoreが45であるレコードをカウントするクエリです。
mysql> select count( case when Score=45 then 1 else NULL end) as SpecificCondition from DemoTable1374;
実行結果は以下の通りです。
+-------------------+ | SpecificCondition | +-------------------+ | 3 | +-------------------+ 1 row in set (0.00 sec)
このように、Scoreが45のレコードは3件(Chris、Bob、Carol)あるため、正しく「3」という結果が返されました。
応用ポイント
ELSE NULLは省略可能です。CASE式は条件に一致しない場合デフォルトでNULLを返すため、count(case when Score=45 then 1 end)のように書いても同じ結果になります。また、複数のCASE条件を並べて記述すれば、1回のクエリで異なる条件ごとの件数を同時に集計することもできます。
-
JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法
executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手
-
MySQLでCURDATE()とLIKE句を使った部分一致検索の方法
MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----