MySQLのテーブルから重複行を削除する方法【INNER JOINを使った実例付き】
MySQLのテーブルに同じ内容のデータが複数登録されてしまい、重複行を整理したいというケースはよくあります。本記事では、DELETE文とINNER JOINを組み合わせる方法で、テーブルから重複データを効率的に削除する手順を、実際のSQL例とともにわかりやすく解説します。
重複行を削除するための基本構文
重複行を削除するには、同じテーブルを自己結合(INNER JOIN)し、条件に一致する行だけをDELETEします。基本構文は以下のとおりです。
delete tbl1 from yourTableName anyAliasName1 inner join yourTableName anyAliasName2 where yourCondition1 and yourCondition2
ポイントは、同一テーブルに対して別々のエイリアス(別名)を付け、比較用の条件をWHERE句で指定することです。
サンプルテーブルの作成
まずは動作確認用のテーブルを作成します。
mysql> create table demo14 -> ( -> id int not null auto_increment primary key, -> name varchar(30) -> ); Query OK, 0 rows affected (1.89 sec)
このテーブルは、自動採番される「id」カラムを主キーとし、「name」カラムに名前を格納するシンプルな構造です。
テストデータの挿入
次に、INSERTコマンドを使って意図的に重複データを含むレコードを挿入します。
mysql> insert into demo14(name) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into demo14(name) values('David');
Query OK, 1 row affected (0.18 sec)
mysql> insert into demo14(name) values('David');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo14(name) values('Bob');
Query OK, 1 row affected (0.15 sec)
mysql> insert into demo14(name) values('John');
Query OK, 1 row affected (0.45 sec)
mysql> insert into demo14(name) values('Carol');
Query OK, 1 row affected (0.16 sec)現在のレコードを確認する
SELECT文でテーブルの中身を確認してみましょう。
mysql> select *from demo14;
実行結果は以下のとおりです。「David」と「John」がそれぞれ2件ずつ重複していることがわかります。
+----+-------+ | id | name | +----+-------+ | 1 | John | | 2 | David | | 3 | David | | 4 | Bob | | 5 | John | | 6 | Carol | +----+-------+ 6 rows in set (0.00 sec)
重複行を削除するクエリ
それでは、重複データを削除するクエリを実行します。ここでは「nameが同じ行のうち、idが小さい方を残す」というルールで削除を行います。
mysql> delete tbl1 from demo14 tbl1 -> inner join demo14 tbl2 -> where -> tbl1.id < tbl2.id and -> tbl1.name = tbl2.name -> ; Query OK, 2 rows affected (0.20 sec)
このクエリの仕組みは以下のとおりです。
- tbl1:削除対象となる側のテーブル(エイリアス)
- tbl2:比較用として結合した同じテーブル(エイリアス)
- tbl1.id < tbl2.id:より新しい(idが大きい)行を残すための条件
- tbl1.name = tbl2.name:nameカラムの値が一致する行同士を結合する条件
実行結果を見ると、2行が削除されたことがわかります。
削除後のレコードを確認する
再度SELECT文を実行して、重複が正しく除去されたか確認します。
mysql> select *from demo14;
実行結果は以下のとおりです。
+----+-------+ | id | name | +----+-------+ | 3 | David | | 4 | Bob | | 5 | John | | 6 | Carol | +----+-------+ 4 rows in set (0.00 sec)
「David」と「John」の重複行がそれぞれ1件ずつになり、テーブルには4件のユニークなレコードだけが残りました。
まとめ
MySQLで重複行を削除する場合は、DELETE文とINNER JOINによる自己結合を活用するのが定番の手法です。どちらの行を残すかは「tbl1.id < tbl2.id」のような比較条件で自由に制御できるため、最新のレコードを優先して残したい場合にも柔軟に対応できます。大量データを扱う際は、事前にバックアップを取得してから実行することをおすすめします。
-
MySQLで重複レコードを含むテーブルから特定の値を1件だけ削除する方法
MySQLでテーブル内のレコードを削除するにはDELETE文を使用します。しかし、同じ値の重複レコードが複数存在する場合に、そのうち1件だけを削除したいケースがあります。そんなときは、LIMIT句を組み合わせることで、削除対象の件数を制限できます。基本構文delete from yourTableName where yourColumnName=yourValue limit 1;この構文では、WHERE句で削除対象の条件を指定し、LIMIT 1によって該当するレコードのうち最初の1件のみを削除します。実際にテーブルを作成して確認してみようまず、サンプル用のテーブルを作成します。mysql&
-
MySQLでテーブルのデータを削除した後にAUTO_INCREMENTを1から再開させる方法
MySQLでデータ削除後にAUTO_INCREMENTを1に戻す方法MySQLでは、DELETE文でレコードを削除してもAUTO_INCREMENTの値はリセットされず、次に挿入されるレコードには続きの番号が割り当てられます。自動インクリメントの値を1に戻したい場合は、TRUNCATE TABLEコマンドを使用します。本記事では、実際のSQL例を使ってその動作を確認していきます。検証用テーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1796 ( StudentId int NOT NULL AUTO_INCREMENT