MySQLのJOINを使ってテーブル内の重複した値を見つける方法
MySQLでテーブル内の重複データを検出したい場面は多くあります。本記事では、JOIN(自己結合)を使って、特定の列に含まれる重複した値と、その該当レコードを一緒に取得する方法を解説します。
サンプルテーブルの準備
ここでは、「stock_item」という名前のテーブルを例に説明します。このテーブルでは、quantity(数量)列に重複した値が含まれています。具体的には、商品名「Notebooks(ノート)」と「Pencil(鉛筆)」のquantity列に同じ値「40」が登録されています。
mysql> Select * from stock_item; +------------+----------+ | item_name | quantity | +------------+----------+ | Calculator | 89 | | Notebooks | 40 | | Pencil | 40 | | Pens | 32 | | Shirts | 29 | | Shoes | 29 | | Trousers | 29 | +------------+----------+ 7 rows in set (0.00 sec)
表を見ると、数量「40」だけでなく「29」にも複数の商品が存在することが分かります。
JOINを使った重複値の検出クエリ
次のクエリでは、MySQLのINNER JOIN(自己結合)を利用することで、quantity列の重複値と、それに該当する商品名を一緒に取得できます。
mysql> Select distinct g.item_name,g.quantity from stock_item g
-> INNER JOIN Stock_item b ON g.quantity = b.quantity
-> WHERE g.item_name<>b.item_name;
+-----------+----------+
| item_name | quantity |
+-----------+----------+
| Pencil | 40 |
| Notebooks | 40 |
| Shoes | 29 |
| Trousers | 29 |
| Shirts | 29 |
+-----------+----------+
5 rows in set (0.00 sec)
クエリの仕組み
このクエリがどのように動作しているのか、ポイントごとに解説します。
- 自己結合: 同じテーブル「stock_item」に対して、別名
gとbを付けて2回参照し、ON g.quantity = b.quantityの条件で数量が一致する行同士を組み合わせます。 - 自分自身の除外:
WHERE g.item_name <> b.item_nameという条件により、同一商品同士の組み合わせ(自分自身との結合結果)を除外し、「異なる商品名でありながら同じ数量を持つ行」だけを抽出します。 - 重複行の除去:
DISTINCTを指定することで、結合によって生じる重複した結果行を取り除き、すっきりとした出力にしています。
この手法を使えば、GROUP BYやHAVINGを使う方法とは異なり、重複している実際の行(商品名など)を直接確認できるのが大きなメリットです。大量のデータから重複レコードを調査・クリーンアップする際にぜひ活用してください。
-
MySQLでテーブルのカラム(列)数を調べる方法を解説
MySQLでテーブルに含まれるカラム(列)の数を確認したい場合は、information_schema.columns に対して count(*) 関数を使い、WHERE 句で対象テーブルを指定するのが基本の方法です。この記事では、実際のSQL例とともに、具体的な手順をわかりやすく解説します。サンプルテーブルの作成まずは動作確認用のテーブルを作成します。mysql> create table NumberOfColumns -> ( -> id int, -> FirstName varchar(100), -> LastName varc
-
LEFT JOINを使ってMySQLテーブルの重複データを削除する方法
はじめにMySQLのテーブルには、意図せず重複したデータが登録されてしまうことがあります。本記事では、LEFT JOINを活用して、重複する値を効率的に削除する方法を解説します。具体的なサンプルコードとともに、手順をわかりやすく紹介します。1. サンプルテーブルの作成まず、デモ用のテーブルを作成します。mysql> create table DemoTable( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName varchar(100));