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

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」に対して、別名 gb を付けて2回参照し、ON g.quantity = b.quantity の条件で数量が一致する行同士を組み合わせます。
  • 自分自身の除外: WHERE g.item_name <> b.item_name という条件により、同一商品同士の組み合わせ(自分自身との結合結果)を除外し、「異なる商品名でありながら同じ数量を持つ行」だけを抽出します。
  • 重複行の除去: DISTINCT を指定することで、結合によって生じる重複した結果行を取り除き、すっきりとした出力にしています。

この手法を使えば、GROUP BYやHAVINGを使う方法とは異なり、重複している実際の行(商品名など)を直接確認できるのが大きなメリットです。大量のデータから重複レコードを調査・クリーンアップする際にぜひ活用してください。

  1. MySQLでテーブルのカラム(列)数を調べる方法を解説

    MySQLでテーブルに含まれるカラム(列)の数を確認したい場合は、information_schema.columns に対して count(*) 関数を使い、WHERE 句で対象テーブルを指定するのが基本の方法です。この記事では、実際のSQL例とともに、具体的な手順をわかりやすく解説します。サンプルテーブルの作成まずは動作確認用のテーブルを作成します。mysql> create table NumberOfColumns -> ( -> id int, -> FirstName varchar(100), -> LastName varc

  2. LEFT JOINを使ってMySQLテーブルの重複データを削除する方法

    はじめにMySQLのテーブルには、意図せず重複したデータが登録されてしまうことがあります。本記事では、LEFT JOINを活用して、重複する値を効率的に削除する方法を解説します。具体的なサンプルコードとともに、手順をわかりやすく紹介します。1. サンプルテーブルの作成まず、デモ用のテーブルを作成します。mysql> create table DemoTable(    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,    FirstName varchar(100));