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

MySQLで3回以上出現する重複データのみを抽出する方法(HAVING COUNTの使い方)

MySQLで3回以上重複している値を抽出するには

MySQLで、テーブル内の同じ値が3回以上出現している重複データだけを表示したい場合は、GROUP BYHAVING COUNT()を組み合わせることで簡単に実現できます。この記事では、実際のサンプルを使いながら手順を詳しく解説します。

1. サンプルテーブルの作成

まず、テスト用のテーブルを作成します。以下のSQLを実行してください。

mysql> create table DemoTable1351
    -> (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(40)
    -> );
Query OK, 0 rows affected (1.08 sec)

このテーブルには、自動採番される「StudentId」と、生徒名を格納する「StudentName」の2つのカラムがあります。

2. テストデータの挿入

次に、INSERT文を使って複数のレコードを登録します。意図的に同じ名前を何度か挿入し、重複データを作っておきます。

mysql> insert into DemoTable1351(StudentName) values('Chris');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1351(StudentName) values('Bob');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1351(StudentName) values('Bob');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1351(StudentName) values('David');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1351(StudentName) values('Bob');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1351(StudentName) values('David');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1351(StudentName) values('Bob');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1351(StudentName) values('Mike');
Query OK, 1 row affected (0.68 sec)
mysql> insert into DemoTable1351(StudentName) values('David');
Query OK, 1 row affected (0.12 sec)

3. 登録データの確認

SELECT文ですべてのレコードを表示して、テーブルの中身を確認してみましょう。

mysql> select * from DemoTable1351;

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

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Chris       |
|         2 | Bob         |
|         3 | Bob         |
|         4 | David       |
|         5 | Bob         |
|         6 | David       |
|         7 | Bob         |
|         8 | Mike        |
|         9 | David       |
+-----------+-------------+
9 rows in set (0.00 sec)

この時点で、「Bob」は4回、「David」は3回、「Chris」と「Mike」はそれぞれ1回だけ出現していることがわかります。

4. 3回以上重複している値だけを抽出するクエリ

ここで本題です。重複が3回以上ある値のみを表示するには、GROUP BYでグループ化し、HAVING句で出現回数を絞り込みます。

mysql> select * from DemoTable1351
    -> group by StudentName
    -> having count(StudentName) >=3;

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

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         2 | Bob         |
|         4 | David       |
+-----------+-------------+
2 rows in set (0.00 sec)

「Bob」(4回)と「David」(3回)だけが表示され、1回しか出現していない「Chris」と「Mike」は除外されました。

解説:GROUP BYとHAVINGの役割

  • GROUP BY StudentName:同じ名前のレコードを1つのグループにまとめます。
  • HAVING COUNT(StudentName) >= 3:グループごとのレコード数を集計し、3件以上のグループだけを抽出します。

なお、WHERE句は集計前にフィルタリングを行うため、集計結果に対する条件指定にはWHEREではなくHAVINGを使う必要があります。この点は初心者がつまずきやすいポイントなので、覚えておくとよいでしょう。

また、実務ではSELECT *ではなくSELECT StudentName, COUNT(*) AS 出現回数のように件数を一緒に表示すると、より実用的な結果が得られます。SQLモードによってはGROUP BYで指定していないカラムをSELECTする際にエラー(ONLY_FULL_GROUP_BY)が発生する場合もあるため、必要なカラムだけを明示的に指定する書き方を推奨します。

  1. MySQLで文字列の先頭15文字だけを表示するクエリの書き方

    MySQLで文字列の先頭(左側)から指定した文字数だけを取り出すには、LEFT()関数を使用します。第1引数に対象の文字列、第2引数に取得したい文字数を指定するだけで、手軽に部分文字列を抽出できます。 この記事では、テーブルに登録されたタイトルの先頭15文字だけを表示する方法を、実際のSQLと実行結果付きで順を追って解説します。 1. サンプルテーブルを作成する まず、CREATE TABLE文でテーブルを作成します。 mysql> create table DemoTable     -> (    &nbs

  2. MySQLでテーブルを更新し、新しい列に名前のイニシャルを表示する方法

    MySQLでは、LEFT()関数とSUBSTRING_INDEX()関数を組み合わせることで、氏名からイニシャル(頭文字)だけを取り出すことができます。この記事では、実際にテーブルを作成し、既存のデータからイニシャルを生成して新しい列に格納する手順を解説します。 1. テーブルの作成 まず、氏名を保存する「full_name」列と、イニシャルを格納する「short_name」列を持つテーブルを作成しましょう。 mysql> create table demo13 -> ( -> full_name varchar(100), -> short_name varchar