MySQLの単一クエリでブール型フィールドの値をカウントする方法
MySQLでは、SUM関数とCASE文を組み合わせることで、単一のクエリ内でブール型(真偽値)フィールドの値を効率的にカウントできます。本記事では、サンプルテーブルを作成し、実際にクエリを実行しながらその手順を詳しく解説します。
サンプルテーブルの作成
まず、例として使用するデモテーブルを作成しましょう。
mysql> create table countBooleanFieldDemo
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentFirstName varchar(20),
-> isPassed tinyint(1)
-> );
Query OK, 0 rows affected (0.63 sec)
このテーブルは、学生ID(StudentId)、学生名(StudentFirstName)、合格判定(isPassed)の3つのカラムで構成されています。isPassedカラムはtinyint(1)型で定義されており、MySQLではブール値を0(偽)と1(真)で表現します。
テストデータの挿入
次に、INSERTコマンドを使用してテーブルにレコードを挿入します。以下のクエリを実行してください。
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Larry',0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Mike',1);
Query OK, 1 row affected (0.17 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Sam',0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Carol',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Bob',1);
Query OK, 1 row affected (0.16 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('David',1);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Ramit',0);
Query OK, 1 row affected (0.28 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Chris',1);
Query OK, 1 row affected (0.20 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Robert',1);
Query OK, 1 row affected (0.16 sec)挿入したレコードの確認
SELECT文ですべてのレコードを表示し、データが正しく登録されているか確認します。
mysql> select *from countBooleanFieldDemo;
実行結果は以下の通りです。
+-----------+------------------+----------+
| StudentId | StudentFirstName | isPassed |
+-----------+------------------+----------+
| 1 | Larry | 0 |
| 2 | Mike | 1 |
| 3 | Sam | 0 |
| 4 | Carol | 1 |
| 5 | Bob | 1 |
| 6 | David | 1 |
| 7 | Ramit | 0 |
| 8 | Chris | 1 |
| 9 | Robert | 1 |
+-----------+------------------+----------+
9 rows in set (0.00 sec)
9件のレコードのうち、合格(1)が6件、不合格(0)が3件であることがわかります。
ブール値を単一クエリでカウントする
それでは、本題である「1つのクエリでブール型フィールドの値をカウントする」方法を見ていきましょう。ポイントは、MySQLでは比較式が真の場合に1、偽の場合に0を返すという特性を利用することです。この結果をSUM関数で合計すれば、条件に一致する行数を数えられます。
mysql> select sum(isPassed= 1) as `True`, sum(isPassed = 0) as `False`,
-> (
-> case when sum(isPassed = 1) > 0 then sum(isPassed = 0) / sum(isPassed = 1)
-> end
-> )As TotalPercentage
-> from countBooleanFieldDemo;
実行結果は以下の通りです。
+------+-------+-----------------+
| True | False | TotalPercentage |
+------+-------+-----------------+
| 6 | 3 | 0.5000 |
+------+-------+-----------------+
1 row in set (0.00 sec)
クエリの解説
このクエリの各部分がどのように機能しているかを確認しましょう。
- sum(isPassed = 1):isPassedが1(真)である行の数をカウントし、エイリアス「True」として表示します。
- sum(isPassed = 0):isPassedが0(偽)である行の数をカウントし、エイリアス「False」として表示します。
- CASE文の部分:合格者数が0より大きい場合に、不合格者数を合格者数で割った割合(TotalPercentage)を計算します。この例では3 ÷ 6 = 0.5000、つまり不合格率が50%であることを示しています。
このように、SUM関数とCASE文を組み合わせれば、複数回クエリを実行することなく、単一のクエリでブール型フィールドの件数集計と割合の計算を同時に行うことができます。ダッシュボードやレポート作成時の集計処理などで、ぜひ活用してみてください。
-
MySQLでフィールド値に含まれるカンマの数をカウントする方法
MySQLでフィールド値に含まれるカンマの数をカウントする方法カンマ区切りで保存されたデータから、カンマがいくつ含まれているかを調べたいケースは意外と多くあります。MySQLではLENGTH()関数とREPLACE()関数を組み合わせることで、シンプルなクエリひとつでカンマの個数をカウントできます。基本構文以下がカンマをカウントするための基本構文です。select length(対象カラム名) - length(replace(対象カラム名, ,, )) as エイリアス名 from テーブル名;このクエリの仕組みは非常にシンプルです。元の文字列の長さから、カンマをすべて削除した文字列の長さを
-
【MySQL】SUM()関数を使って単一クエリで特定の列値ごとの複数カウントを取得する方法
特定の列値に基づくカウントを1つのMySQLクエリで複数取得するには、集計関数SUM()を活用します。MySQLでは「列 = 値」という条件式が真なら1、偽なら0を返すため、その結果をSUM()で合計することで、条件に一致する行数を数えられます。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1790 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Score int ); Query OK, 0 rows af