MySQLで特定の値ごとの出現回数をカウントする方法(SUM関数の活用)
MySQLで既知の値の出現回数をカウントするには?
MySQLで「John」や「Robert」といった特定の値がテーブル内にそれぞれ何件存在するかを調べたい場合、SUM()集計関数を活用するのが効果的です。条件式が真なら1、偽なら0を返すというMySQLの特性を利用することで、複数の値の出現回数をたった1回のクエリで同時に集計できます。
本記事では、サンプルテーブルの作成から実際のカウント方法まで、手順を追って詳しく解説します。
準備:サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成しましょう。
mysql> create table DemoTable636 (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(100)
);
Query OK, 0 rows affected (0.51 sec)テストデータの挿入
次に、INSERTコマンドを使って複数のレコードを登録します。
mysql> insert into DemoTable636(StudentFirstName) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Sam');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Mike');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable636(StudentFirstName) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.16 sec)SELECT文ですべてのレコードを確認してみましょう。
mysql> select * from DemoTable636;
実行結果は以下の通りです。
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 1 | John | | 2 | Robert | | 3 | Robert | | 4 | Sam | | 5 | Mike | | 6 | John | | 7 | Robert | +-----------+------------------+ 7 rows in set (0.00 sec)
既知の値ごとの出現回数をカウントするクエリ
それでは、各名前(John・Robert・Sam・Mike)がそれぞれ何回出現しているかを取得するクエリを見ていきましょう。
mysql> select
sum(StudentFirstName='John') AS JOHN_COUNT,
sum(StudentFirstName='Robert') AS ROBERT_COUNT,
sum(StudentFirstName='Sam') AS SAM_COUNT,
sum(StudentFirstName='Mike') AS MIKE_COUNT
from DemoTable636;実行結果:
+------------+--------------+-----------+------------+ | JOHN_COUNT | ROBERT_COUNT | SAM_COUNT | MIKE_COUNT | +------------+--------------+-----------+------------+ | 2 | 3 | 1 | 1 | +------------+--------------+-----------+------------+ 1 row in set (0.00 sec)
この結果から、「John」が2回、「Robert」が3回、「Sam」が1回、「Mike」が1回出現していることが一目でわかります。
仕組みの解説
このテクニックが機能するのは、MySQLにおいて比較式「StudentFirstName='John'」が真の場合に1、偽の場合に0を返すためです。SUM()関数がこれらの1と0を合計することで、「条件に一致した行数=その値の出現回数」として集計される仕組みです。
代替手段:CASE式やCOUNT()を使う方法
同様の結果は、CASE式やCOUNT()関数を組み合わせても得られます。例えば以下のように記述できます。
select
count(case when StudentFirstName='John' then 1 end) AS JOHN_COUNT,
sum(case when StudentFirstName='Robert' then 1 else 0 end) AS ROBERT_COUNT
from DemoTable636;可読性や運用方針に応じて、最適な書き方を選択するとよいでしょう。
まとめ
MySQLで既知の値ごとの出現回数をカウントしたい場合は、SUM(列名='値')というシンプルな形式が非常に便利です。1回のクエリで複数の値を同時に集計できるため、管理画面のダッシュボードやレポート作成時の統計処理など、さまざまな場面で活用できます。
-
MySQLで個別の値の出現回数をカウントし、結果を新しい列として表示する方法
MySQLでは、GROUP BY句とCOUNT()関数を組み合わせることで、各値が何回出現したかを簡単に集計できます。この記事では、実際にテーブルを作成し、重複する値の出現回数をカウントして結果を表示する手順を解説します。 1. サンプルテーブルの作成 まず、集計対象となるテーブルを作成しましょう。 mysql> create table DemoTable ( Value int ); Query OK, 0 rows affected (0.57 sec) 2. テストデータの挿入 INSERTコマンドを使って、いくつかのレコードを挿入します。意図的に同じ値を複数回登録し
-
MySQLのCOUNT(DISTINCT)処理が遅い原因と、インデックスを使った高速化の方法
MySQLのCOUNT(DISTINCT)を高速化するにはインデックスが有効MySQLでCOUNT(DISTINCT)を実行した際に処理が遅くなる場合は、対象カラムにINDEX(インデックス)を作成することで大幅に高速化できます。ここでは、複合インデックスを設定したテーブルを作成し、実際にCOUNT(DISTINCT)クエリを実行する手順を解説します。1. インデックス付きテーブルを作成するまず、FirstNameとLastNameの2つのカラムに複合インデックスを設定したテーブルを作成します。mysql> create table DemoTable1905 ( Fir