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

MySQLで1つ以上の列の値が完全に一致する行を検索する方法

MySQLで、1つ以上の列の値が完全に一致する行(重複データ)を検索したい場合は、GROUP BYHAVING をサブクエリと組み合わせて使用するのが効果的です。この記事では、実際の例を通じてその手順をわかりやすく解説します。

サンプルテーブルの作成

まず、デモ用のテーブルを作成しましょう。

mysql> create table DemoTable1861
     (
     Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
     Name varchar(20),
     Marks int
     );
Query OK, 0 rows affected (0.00 sec)

レコードの挿入

続いて、INSERTコマンドを使ってテーブルにレコードを挿入します。ここでは、意図的に同じ「Name」と「Marks」の組み合わせを持つデータを含めています。

mysql> insert into DemoTable1861(Name,Marks) values('John',45);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('Chris',74);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('David',89);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('Chris',74);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('John',49);
Query OK, 1 row affected (0.00 sec)

テーブルの内容を確認する

SELECT文を実行して、テーブル内のすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1861;

実行すると、次のような結果が出力されます。

+----+-------+-------+
| Id | Name  | Marks |
+----+-------+-------+
|  1 | John  |    45 |
|  2 | Chris |    74 |
|  3 | David |    89 |
|  4 | Chris |    74 |
|  5 | John  |    49 |
+----+-------+-------+
5 rows in set (0.00 sec)

結果を見ると、「Chris / 74」という組み合わせが2件(Id: 2 と 4)存在していることがわかります。

列の値が完全一致する行を検索するクエリ

それでは、1つ以上の列の値が完全に一致する行を抽出するクエリを見ていきましょう。ポイントは、サブクエリ内で GROUP BY により列の組み合わせごとにグループ化し、HAVING count(*) > 1 で重複しているグループだけを絞り込むことです。

mysql> select Id,Name,Marks from DemoTable1861
     where (Name,Marks) IN ( select Name,Marks from DemoTable1861
     group by Name,Marks
     having count(*) > 1);

このクエリを実行すると、以下のような出力が得られます。

+----+-------+-------+
| Id | Name  | Marks |
+----+-------+-------+
|  2 | Chris |    74 |
|  4 | Chris |    74 |
+----+-------+-------+
2 rows in set (0.00 sec)

クエリの仕組み

このクエリは、次の2つのステップで動作しています。

  • サブクエリ部分: Name と Marks の組み合わせでグループ化し、出現回数が2回以上(count(*) > 1)の組み合わせのみを返します。
  • 外部クエリ部分: サブクエリが返した (Name, Marks) のタプルと一致する行を、元のテーブルからすべて取得します。

MySQLでは行コンストラクタ(タプル)に対するIN句がサポートされているため、このような書き方が可能です。この手法を使えば、単一の列だけでなく、複数の列を組み合わせた重複チェックにも柔軟に対応できます。データクレンジングや整合性チェックの際にぜひ活用してください。

  1. MySQLで特定のカラム名を持つテーブルを検索する方法

    MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a

  2. MySQLで特定の値を検索してNULLに置き換える方法をわかりやすく解説

    MySQLで値を検索してNULLに置き換える基本構文 MySQLでテーブル内の特定の値を見つけてNULLに置き換えたい場合は、UPDATE文とSET句を使って yourColumnName = NULL のように指定します。基本的な構文は以下の通りです。 update yourTableName set yourColumnName=NULL where yourColumnName=yourValue; WHERE句で対象となる値を指定することで、該当する行だけをNULLに更新できるのがポイントです。 サンプルテーブルの作成 まずは動作確認用のテーブルを作成しましょう。 mysql>