MySQLで重複を除いた個別の値(DISTINCT)をカウントする方法
MySQLで個別の値をカウントするには?
MySQLでテーブル内の重複しない(ユニークな)値の件数を取得したい場合は、集計関数 COUNT() と DISTINCT キーワードを組み合わせることで実現できます。この方法を使えば、同じ値が複数回登録されていても、1つとしてカウントされます。
基本構文
SELECT COUNT(DISTINCT yourColumnName) AS anyVariableName FROM yourTableName;
COUNT(DISTINCT カラム名) のように指定することで、指定したカラムの中から重複を除外した値の総数を取得できます。
それでは、実際にサンプルテーブルを作成して動作を確認してみましょう。
サンプルテーブルの作成
まず、以下のクエリでテーブルを作成します。
mysql> CREATE TABLE DistinctDemo
-> (
-> Name VARCHAR(200)
-> );
Query OK, 0 rows affected (0.58 sec)今回は「Name」という1つのカラムだけを持つシンプルなテーブルを用意しました。
重複データを挿入する
DISTINCTの効果を確認するため、あえて重複するレコードを挿入していきます。以下がレコード挿入用のクエリです。
mysql> INSERT INTO DistinctDemo VALUES('John');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DistinctDemo VALUES('Sam');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DistinctDemo VALUES('John');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DistinctDemo VALUES('Johnson');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DistinctDemo VALUES('John');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO DistinctDemo VALUES('Johnson');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DistinctDemo VALUES('Sam');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DistinctDemo VALUES('Johnson');
Query OK, 1 row affected (0.10 sec)登録されたレコードを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> SELECT * FROM DistinctDemo;
実行結果は以下の通りです。同じ名前が何度も登録されているのがわかります。
+---------+ | Name | +---------+ | John | | Sam | | John | | Johnson | | John | | Johnson | | Sam | | Johnson | +---------+ 8 rows in set (0.00 sec)
合計8件のレコードがありますが、そのうち重複しない名前は「John」「Sam」「Johnson」の3種類だけです。
DISTINCTを使って個別の値をカウントする
それでは、本題である重複を除いた値のカウントを実行してみましょう。使用するクエリは以下の通りです。
mysql> SELECT COUNT(DISTINCT Name) AS DistinctValues FROM DistinctDemo;
実行結果:
+----------------+ | DistinctValues | +----------------+ | 3 | +----------------+ 1 row in set (0.01 sec)
結果の解釈
結果として「3」が返されました。これは、テーブル全体には8件のレコードが存在するものの、重複を除外した個別の値は3種類(John・Sam・Johnson)しかないことを示しています。
このように COUNT(DISTINCT) を使えば、顧客リストのユニークな氏名数や、ログデータから固有のユーザー数を集計するなど、さまざまな場面で活用できます。単純な COUNT(*) や COUNT(カラム名) との違いを理解しておくと、データ集計の幅が大きく広がるでしょう。
-
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のCOUNT(DISTINCT)処理が遅い原因と、インデックスを使った高速化の方法
MySQLのCOUNT(DISTINCT)を高速化するにはインデックスが有効MySQLでCOUNT(DISTINCT)を実行した際に処理が遅くなる場合は、対象カラムにINDEX(インデックス)を作成することで大幅に高速化できます。ここでは、複合インデックスを設定したテーブルを作成し、実際にCOUNT(DISTINCT)クエリを実行する手順を解説します。1. インデックス付きテーブルを作成するまず、FirstNameとLastNameの2つのカラムに複合インデックスを設定したテーブルを作成します。mysql> create table DemoTable1905 ( Fir