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

【MySQL】重複レコードを削除して1件だけ残す方法を実例付きで解説

MySQLでテーブル内に同じデータが複数存在する場合、DELETE文に条件を指定することで、1件のレコードを残しながら残りの重複レコードをまとめて削除できます。

この記事では、実際にテーブルを作成し、重複データを削除する手順をサンプルコードとともにわかりやすく解説します。

1. サンプルテーブルを作成する

まずは動作確認用のテーブルを作成しましょう。StudentIdを主キー(AUTO_INCREMENT)とし、StudentNameカラムを持つシンプルなテーブルです。

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName varchar(40)
);
Query OK, 0 rows affected (0.48 sec)

2. テストデータを挿入する

INSERTコマンドを使ってレコードを登録します。ここでは意図的に「Carol」という名前を3回挿入し、重複データを作り出しています。

mysql> insert into DemoTable(StudentName) values('John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(StudentName) values('Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(StudentName) values('Sam');
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable(StudentName) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(StudentName) values('David');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(StudentName) values('Carol');
Query OK, 1 row affected (0.26 sec)

3. 現在のデータを確認する

SELECT文でテーブルの中身を確認すると、「Carol」が3件(StudentId:2、4、6)登録されていることがわかります。

mysql> select *from DemoTable;

実行結果:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1         | John        |
| 2         | Carol       |
| 3         | Sam         |
| 4         | Carol       |
| 5         | David       |
| 6         | Carol       |
+-----------+-------------+
6 rows in set (0.00 sec)

4. 重複レコードを削除して1件だけ残すSQL

それでは、重複データを削除し、各名前につき1件だけ残すクエリを見てみましょう。ポイントは同一テーブルを自己結合させ、同じStudentNameを持つ行同士を比較し、StudentIdが大きい方(後から登録された方)を削除するという条件です。

mysql> delete tbl1 from DemoTable tbl1,DemoTable tbl2
WHERE
tbl1.StudentName = tbl2.StudentName AND tbl1.StudentId > tbl2.StudentId;
Query OK, 2 rows affected (0.79 sec)

このクエリにより、「Carol」のうちStudentIdが4と6の2行が削除され、最もIDの小さい1件(StudentId:2)だけが残ります。

5. 削除後のデータを確認する

再度SELECT文でテーブルを表示して、結果を確認しましょう。

mysql> select *from DemoTable;

実行結果:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1         | John        |
| 2         | Carol       |
| 3         | Sam         |
| 5         | David       |
+-----------+-------------+
4 rows in set (0.00 sec)

まとめ

重複レコードの削除は、「DELETE 対象テーブルの別名 FROM テーブル名 別名1, テーブル名 別名2 WHERE 同一項目が一致 かつ IDが大きい」という自己結合の構文で実現できます。

  • 比較対象となるユニークなカラム(ここではAUTO_INCREMENTの主キー)が必要です。
  • IDが小さい方を残したい場合は「>」を、大きい方を残したい場合は「<」に変更します。

大量データを扱う場合は、必ずバックアップを取得したうえで、SELECT文で削除対象を事前に確認してから実行することをおすすめします。

  1. MySQLで重複レコードの値をSUM関数とGROUP BYで合計する方法

    MySQLでは、GROUP BY句とSUM関数を組み合わせることで、重複しているレコードの値をグループごとにまとめて合計できます。この記事では、学生名ごとに点数を集計する具体例を通して、その手順をわかりやすく解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> StudentName varchar(20), -> StudentMarks int -> );Query OK, 0 rows affected (0.68 sec)ここでは、学生名を

  2. MySQLで特定の値より大きいレコードだけを抽出する方法|WHERE句を使った条件指定の基本

    MySQLで特定の値以下のレコードを除外するには? MySQLである値を基準に、それより小さいレコードを除外し、大きい値を持つレコードだけを取得したい場合は、WHERE句に比較演算子「>(より大きい)」を組み合わせるのが基本です。 基本構文 SELECT * FROM テーブル名 WHERE カラム名 > 値; この構文により、指定したカラムの値が条件値より大きい行のみが結果セットとして返されます。 実際に試してみよう:サンプルテーブルの作成 まずは動作を確認するためのテーブルを作成します。 mysql> create table demo27 -> ( ->