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 BYとHAVING 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 BYとHAVINGだけでシンプルに抽出できます。以下のクエリでは、重複している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()関数による条件を指定するだけで、重複データの有無を手軽にチェックできます。大量データの中から重複を洗い出したいときや、ユニーク制約を追加する前の事前調査などにぜひ活用してください。
-
MySQLでURLレコードの一部を検索して置き換える方法
MySQLでURLなどの文字列レコードの一部を検索して置き換えたい場合、最もシンプルな方法はREPLACE()関数を使うことです。この記事では、実際のサンプルを使いながら、URLの一部を一括置換する手順をわかりやすく解説します。1. サンプルテーブルの作成まず、URLを格納するためのテーブルを作成します。mysql> create table DemoTable2025 -> ( -> URL text -> );Query OK, 0 rows affected (0.88 sec)2. テストデータの挿入次に、INSERTコマンドを使ってサンプルレ
-
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 -> (