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

MySQLで重複する列の値を検索して表示する方法(GROUP BY HAVING句の使い方)

MySQLでテーブル内の重複データを検索したい場面は多くあります。例えば、登録データの重複チェックやデータクレンジングなどが挙げられます。このような場合には、GROUP BY句とHAVING句を組み合わせることで、簡単に重複する列の値を抽出できます。

重複検出の基本的な考え方

GROUP BY句で列の値ごとにレコードをグループ化し、HAVING句で「同じ値が2件以上存在するグループ」だけを絞り込むことで、重複している値だけを取り出すことができます。

サンプルテーブルの作成

まず、検証用のテーブルを作成します。

mysql> create table DemoTable1858
    (
    ModelNumber varchar(50)
    );
Query OK, 0 rows affected (0.00 sec)

テストデータの挿入

次に、INSERT文を使ってサンプルデータを登録します。ここでは、意図的に「Audi A4」と「Audi Q5」を重複させて登録しています。

mysql> insert into DemoTable1858 values('Audi A4');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi A6');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi A4');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi Q5');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi R8');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1858 values('Audi Q5');
Query OK, 1 row affected (0.00 sec)

登録データの確認

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

mysql> select * from DemoTable1858;

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

+-------------+
| ModelNumber |
+-------------+
| Audi A4     |
| Audi A6     |
| Audi A4     |
| Audi Q5     |
| Audi R8     |
| Audi Q5     |
+-------------+
6 rows in set (0.00 sec)

この時点では「Audi A4」と「Audi Q5」がそれぞれ2回登録されていることが分かります。

重複する値を検索するクエリ

それでは、重複している列の値を抽出するクエリを見てみましょう。GROUP BY句でModelNumberごとにグループ化し、HAVING句でCOUNT関数の結果が2以上のグループのみを取得します。

mysql> select ModelNumber from DemoTable1858
    group by ModelNumber
    having count(ModelNumber) >= 2;

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

+-------------+
| ModelNumber |
+-------------+
| Audi A4     |
| Audi Q5     |
+-------------+
2 rows in set (0.00 sec)

重複していた「Audi A4」と「Audi Q5」だけが表示されました。

重複回数を一緒に表示する応用テクニック

実務では、どの値が何回重複しているのかを確認したいケースも多いでしょう。その場合は、COUNT関数をSELECT句に追加することで、重複回数も同時に表示できます。

mysql> select ModelNumber, count(ModelNumber) as DuplicateCount
    from DemoTable1858
    group by ModelNumber
    having count(ModelNumber) >= 2;

このようにGROUP BY句とHAVING句を組み合わせれば、WHERE句では集計後の値に対して条件を指定できないため、HAVING句を使う点がポイントです。重複データの検出やデータ品質のチェックにぜひ活用してください。

  1. MySQLで重複するタプルを検出してカウントを表示する方法

    MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入

  2. MySQLでNULLを含む列からNULL以外(NOT NULL)の値だけを抽出して表示する方法

    MySQLのIS NOT NULLを使ってNULL以外の値のみを表示するMySQLで、NULLとNULL以外のレコードが混在する列からNULL以外の値だけを取得したい場合は、IS NOT NULL演算子を使用します。この記事では、実際にテーブルを作成しながら手順を解説します。1. テーブルの作成まず、日付型の列を持つサンプルテーブルを作成します。mysql> create table DemoTable1      (      DueDate date      ); Query OK, 0 ro