MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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(カラム名) との違いを理解しておくと、データ集計の幅が大きく広がるでしょう。

  1. 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が混在

  2. MySQLのCOUNT(DISTINCT)処理が遅い原因と、インデックスを使った高速化の方法

    MySQLのCOUNT(DISTINCT)を高速化するにはインデックスが有効MySQLでCOUNT(DISTINCT)を実行した際に処理が遅くなる場合は、対象カラムにINDEX(インデックス)を作成することで大幅に高速化できます。ここでは、複合インデックスを設定したテーブルを作成し、実際にCOUNT(DISTINCT)クエリを実行する手順を解説します。1. インデックス付きテーブルを作成するまず、FirstNameとLastNameの2つのカラムに複合インデックスを設定したテーブルを作成します。mysql> create table DemoTable1905 ( Fir