MySQLで重複データをすべて抽出する方法【サブクエリを使った実例付き】
MySQLのテーブルに同じ値を持つレコード(重複データ)が複数含まれている場合、それらをすべて抽出したい場面はよくあります。そんなときに便利なのがサブクエリと GROUP BY・HAVING 句を組み合わせた方法です。
この記事では、実際にサンプルテーブルを作成し、重複レコードをすべて取得するまでの手順を順番に解説します。
1. サンプルテーブルの作成
まず、以下のSQL文でテーブルを作成します。Id 列は自動採番(AUTO_INCREMENT)の主キー、Name 列には名前を保存します。
mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.87 sec)
2. テストデータの挿入
INSERT文を使って、いくつかのレコードを登録します。ここでは「John」「Chris」「Mike」を意図的に重複させています。
mysql> insert into DemoTable(Name) values('John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(Name) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Name) values('David');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Name) values('Bob');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(Name) values('Mike');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Name) values('Robert');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Name) values('Mike');
Query OK, 1 row affected (0.12 sec)
3. 登録済みデータの確認
SELECT文ですべてのレコードを表示して、現在のテーブルの状態を確認しておきましょう。
mysql> select *from DemoTable;
出力結果
+----+--------+
| Id | Name |
+----+--------+
| 1 | John |
| 2 | Chris |
| 3 | John |
| 4 | David |
| 5 | Bob |
| 6 | Chris |
| 7 | Mike |
| 8 | Robert |
| 9 | Mike |
+----+--------+
9 rows in set (0.00 sec)
この時点で、「John」(Id: 1, 3)、「Chris」(Id: 2, 6)、「Mike」(Id: 7, 9)の3つの名前がそれぞれ2回ずつ登録されていることがわかります。
4. 重複レコードをすべて抽出するクエリ
重複している行をすべて取得するには、次のようなSQLを実行します。
mysql> select *from DemoTable
-> where Name in (select Name from DemoTable group by Name having count(*) > 1);
出力結果
+----+-------+
| Id | Name |
+----+-------+
| 1 | John |
| 2 | Chris |
| 3 | John |
| 6 | Chris |
| 7 | Mike |
| 9 | Mike |
+----+-------+
6 rows in set (0.09 sec)
クエリの仕組み
このSQLがどのように動作しているのか、内側から見ていきましょう。
- サブクエリ部分:
select Name from DemoTable group by Name having count(*) > 1により、「同じNameが2件以上存在する名前」だけが抽出されます(ここでは John、Chris、Mike)。 - 外側のクエリ:
where Name in (...)の条件に一致する、つまり上記の名前を持つすべての行がメインテーブルから返されます。
このように、サブクエリで重複する値のリストを作り、IN 句で本体テーブルと突き合わせることで、重複レコードをまとめて取得できます。重複チェックやデータクレンジングの前段階として、ぜひ活用してみてください。
-
MySQLで再帰的なSELECTクエリを実行する方法【初心者向けに具体例つきで解説】
MySQLでは、ユーザー定義変数(セッション変数)を活用することで、再帰的なSELECTクエリを実現できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、再帰的なSELECTの具体的な書き方を順を追って解説します。 1. サンプルテーブルの作成 まず、再帰的なSELECTを試すためのサンプルテーブルを作成します。テーブルの作成にはCREATEコマンドを使用します。 mysql> CREATE table tblSelectDemo - > ( - > id int, - > name varchar(100) - > );
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected