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

MySQLで重複レコードを検索・表示する方法【サンプル付きで解説】

データベースを運用していると、同じ値が複数行に登録されている「重複レコード」を確認したい場面があります。本記事では、MySQLのGROUP BY句とHAVING句を組み合わせることで、テーブル内の重複データを簡単に見つけて表示する方法を、実際のSQL文と実行結果とともに順を追って解説します。

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

まず、CREATE TABLE文を使って検証用のテーブルを作成します。ここではID、名前(Name)、所在地(Location)の3つのカラムを持つテーブルを用意しました。

mysql> CREATE table DuplicateFound
-> (
-> ID int,
-> Name varchar(100),
-> Location varchar(200)
-> );
Query OK, 0 rows affected (0.45 sec)

2. テストデータの挿入

次に、INSERT文を使ってレコードを挿入します。あえて「US」と「UK」という同じ所在地を持つ複数のレコードを登録し、重複データを作り出しています。

mysql> INSERT into DuplicateFound values(1,'John','US');
Query OK, 1 row affected (0.10 sec)

mysql> INSERT into DuplicateFound values(2,'Bob','UK');
Query OK, 1 row affected (0.18 sec)

mysql> INSERT into DuplicateFound values(3,'David','US');
Query OK, 1 row affected (0.14 sec)

mysql> INSERT into DuplicateFound values(4,'Smith','US');
Query OK, 1 row affected (0.16 sec)

mysql> INSERT into DuplicateFound values(5,'Carol','UK');
Query OK, 1 row affected (0.16 sec)

3. 登録されたレコードの確認

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

mysql> SELECT * from DuplicateFound;

実行結果は以下の通りです。Locationカラムに「US」が3件、「UK」が2件存在していることがわかります。

+------+-------+----------+
| ID   | Name  | Location |
+------+-------+----------+
| 1    | John  | US       |
| 2    | Bob   | UK       |
| 3    | David | US       |
| 4    | Smith | US       |
| 5    | Carol | UK       |
+------+-------+----------+
5 rows in set (0.00 sec)

4. 重複レコードをまとめて表示するクエリ

重複している値を持つレコードだけを抽出するには、サブクエリ内でGROUP BYHAVING COUNT() > 1を使い、出現回数が2件以上のLocationを特定します。さらにORDER BYで並べ替えることで、同じ所在地のレコードが隣接して表示され、重複がひと目でわかるようになります。

mysql> SELECT * from DuplicateFound
-> where location in (select location from DuplicateFound group by location having count(location) >1 )
-> order by location;

実行結果は以下の通りです。すべてのレコードが重複対象のため全5件が表示され、Locationごとにソートされています。

+------+-------+----------+
| ID   | Name  | Location |
+------+-------+----------+
| 2    | Bob   | UK       |
| 5    | Carol | UK       |
| 1    | John  | US       |
| 3    | David | US       |
| 4    | Smith | US       |
+------+-------+----------+
5 rows in set (0.06 sec)

5. 重複グループごとに代表レコードを表示する

重複しているグループそのものだけを確認したい場合は、GROUP BYHAVINGだけでシンプルに抽出できます。以下のクエリでは、重複しているLocationごとに先頭の1件(Name)を表示しています。

mysql> select Name,location from DuplicateFound
-> group by location
-> having count(location) > 1;

実行結果:

+------+----------+
| Name | Location |
+------+----------+
| John | US       |
| Bob  | UK       |
+------+----------+
2 rows in set (0.04 sec)

このように、GROUP BY句でグループ化した上でHAVING句にCOUNT()関数による条件を指定するだけで、重複データの有無を手軽にチェックできます。大量データの中から重複を洗い出したいときや、ユニーク制約を追加する前の事前調査などにぜひ活用してください。

  1. MySQLでURLレコードの一部を検索して置き換える方法

    MySQLでURLなどの文字列レコードの一部を検索して置き換えたい場合、最もシンプルな方法はREPLACE()関数を使うことです。この記事では、実際のサンプルを使いながら、URLの一部を一括置換する手順をわかりやすく解説します。1. サンプルテーブルの作成まず、URLを格納するためのテーブルを作成します。mysql> create table DemoTable2025 -> ( -> URL text -> );Query OK, 0 rows affected (0.88 sec)2. テストデータの挿入次に、INSERTコマンドを使ってサンプルレ

  2. MySQLでTRUE/FALSEのレコードを0/1として表示する方法

    MySQLでTRUE/FALSEのレコードを0/1として表示する方法MySQLでは、カラムのデータ型をBOOLEANとして定義することで、TRUE/FALSEの値が自動的に0と1として表示されます。BOOLEAN型は内部的にはTINYINT(1)のエイリアスであり、TRUEは1、FALSEは0として扱われます。以下、具体的な手順を解説します。1. テーブルの作成まず、BOOLEAN型のカラムを含むテーブルを作成しましょう。mysql> create table DemoTable2035     -> (