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

MySQLで重複データをすべて抽出する方法【サブクエリを使った実例付き】

MySQLのテーブルに同じ値を持つレコード(重複データ)が複数含まれている場合、それらをすべて抽出したい場面はよくあります。そんなときに便利なのがサブクエリGROUP BYHAVING 句を組み合わせた方法です。

この記事では、実際にサンプルテーブルを作成し、重複レコードをすべて取得するまでの手順を順番に解説します。

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 句で本体テーブルと突き合わせることで、重複レコードをまとめて取得できます。重複チェックやデータクレンジングの前段階として、ぜひ活用してみてください。

  1. MySQLで再帰的なSELECTクエリを実行する方法【初心者向けに具体例つきで解説】

    MySQLでは、ユーザー定義変数(セッション変数)を活用することで、再帰的なSELECTクエリを実現できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、再帰的なSELECTの具体的な書き方を順を追って解説します。 1. サンプルテーブルの作成 まず、再帰的なSELECTを試すためのサンプルテーブルを作成します。テーブルの作成にはCREATEコマンドを使用します。 mysql> CREATE table tblSelectDemo - > ( - > id int, - > name varchar(100) - > );

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected