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

MySQLのCOUNT()とDISTINCTを組み合わせて重複行を除いた件数を取得する方法

はい、COUNT()とDISTINCTを組み合わせることで、重複を除外した行数だけをカウントして表示することができます。

MySQLでは、COUNT()関数単体で使用するとテーブル内のすべての行がカウントされますが、DISTINCTキーワードを組み合わせることで、一意な値を持つ行のみを集計対象にできます。データ分析やレポート作成の際に、重複データを排除した正確な件数が必要になる場面は多く、この組み合わせは非常に実用的です。

COUNT(DISTINCT ...) の基本構文

構文は以下の通りです。

SELECT COUNT(DISTINCT yourColumnName) AS anyVariableName FROM yourTableName;

この構文では、指定したカラム(yourColumnName)から重複する値を取り除いた上で、その件数をカウントします。AS句を使えば、結果にわかりやすい別名を付けることも可能です。

動作確認用テーブルの作成

実際に構文を理解するために、サンプルテーブルを作成してみましょう。以下のクエリでテーブルを作成します。

mysql> create table CountDistinctDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (3.11 sec)

Id列にはAUTO_INCREMENTを設定しているため、レコードを挿入するだけで自動的に連番が採番されます。

サンプルデータの挿入

次に、INSERTコマンドを使ってテーブルにレコードを追加します。意図的に同じ名前(Carol、Bob、Johnなど)を複数回挿入している点に注目してください。

mysql> insert into CountDistinctDemo(Name) values('Carol');
Query OK, 1 row affected (0.48 sec)

mysql> insert into CountDistinctDemo(Name) values('Bob');
Query OK, 1 row affected (0.43 sec)

mysql> insert into CountDistinctDemo(Name) values('Carol');
Query OK, 1 row affected (0.26 sec)

mysql> insert into CountDistinctDemo(Name) values('John');
Query OK, 1 row affected (0.27 sec)

mysql> insert into CountDistinctDemo(Name) values('Bob');
Query OK, 1 row affected (0.35 sec)

mysql> insert into CountDistinctDemo(Name) values('Carol');
Query OK, 1 row affected (0.98 sec)

mysql> insert into CountDistinctDemo(Name) values('John');
Query OK, 1 row affected (0.26 sec)

mysql> insert into CountDistinctDemo(Name) values('Sam');
Query OK, 1 row affected (0.14 sec)

mysql> insert into CountDistinctDemo(Name) values('Mike');
Query OK, 1 row affected (0.53 sec)

mysql> insert into CountDistinctDemo(Name) values('Carol');
Query OK, 1 row affected (0.31 sec)

mysql> insert into CountDistinctDemo(Name) values('David');
Query OK, 1 row affected (0.40 sec)

テーブルの内容を確認する

SELECT文ですべてのレコードを表示してみます。

mysql> select *from CountDistinctDemo;

実行結果は以下の通りです。

+----+-------+
| Id | Name |
+----+-------+
| 1 | Carol |
| 2 | Bob |
| 3 | Carol |
| 4 | John |
| 5 | Bob |
| 6 | Carol |
| 7 | John |
| 8 | Sam |
| 9 | Mike |
| 10 | Carol |
| 11 | David |
+----+-------+
11 rows in set (0.07 sec)

合計11行のレコードが登録されており、「Carol」が4回、「Bob」と「John」がそれぞれ2回登場しています。

DISTINCTなしでCOUNT()を使用した場合

DISTINCTを使用しない場合、COUNT()関数はNULL以外のすべての行をカウントします。以下のクエリを実行してみましょう。

mysql> select count(Name) as TotalName from CountDistinctDemo;

実行結果:

+-----------+
| TotalName |
+-----------+
| 11 |
+-----------+
1 row in set (0.04 sec)

重複した値もそのままカウントされるため、結果は「11」となります。

COUNT()とDISTINCTを組み合わせた場合

次に、COUNT()とDISTINCTを組み合わせたクエリを実行します。

mysql> SELECT COUNT(DISTINCT Name) as UniqueName FROM CountDistinctDemo;

実行結果:

+------------+
| UniqueName |
+------------+
| 6 |
+------------+
1 row in set (0.00 sec)

今回は結果が「6」になりました。これは、11件のレコードの中に含まれる一意な名前(Carol、Bob、John、Sam、Mike、David)が6種類であるためです。

まとめ

COUNT()とDISTINCTを組み合わせることで、重複データを除外した一意な値の件数を簡単に取得できます。

  • COUNT(カラム名):NULLを除く全行をカウントする
  • COUNT(DISTINCT カラム名):重複を除外した一意な値のみをカウントする

ユーザーの重複人数や商品カテゴリ数など、ユニークな値の総数を把握したい場合にぜひ活用してください。

  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クエリで「LIKE concat()」を使用することはできる?

    はい、MySQLではLIKE句とconcat()関数を組み合わせて使用することが可能です。concat()関数で動的にパターン文字列を生成し、それをLIKE句の検索条件として利用できます。実際にサンプルを使って手順を見ていきましょう。まず、テーブルを作成します。mysql> create table DemoTable ( Name varchar(50) ); Query OK, 0 rows affected (0.63 sec)次に、insertコマンドを使ってテーブルにレコードを挿入します。mysql> insert into DemoTable values(Jo