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

MySQLで複数のカラムにまたがる重複データをチェックする方法

MySQLでテーブル内の重複データを確認したい場合、GROUP BY句とHAVING句を組み合わせることで簡単に検出できます。この記事では、複数のカラムにまたがる重複レコードを見つける方法を、実際のSQL例とともにわかりやすく解説します。

重複チェックの基本構文

重複データを抽出するには、対象となるカラムでグループ化し、HAVING句で件数が1件より多いグループを絞り込みます。基本構文は以下の通りです。

SELECT カラム名1, カラム名2, ......N, COUNT(*) AS 任意の別名
FROM テーブル名
GROUP BY カラム名1, カラム名2
HAVING COUNT(*) > 1;

COUNT(*)の値が2以上になる組み合わせが、まさに重複しているレコードです。

サンプルテーブルの作成

それでは、実際に動作を確認してみましょう。まず、以下のクエリでサンプル用のテーブルを作成します。

mysql> create table DuplicateDemo
-> (
-> StudentId int not null,
-> StudentFirstName varchar(100),
-> StudentLastName varchar(100),
-> Primary Key(StudentId)
-> );
Query OK, 0 rows affected (0.50 sec)

このテーブルには「StudentId(主キー)」「StudentFirstName」「StudentLastName」の3つのカラムがあります。主キーであるStudentIdは必ず一意になるため、重複チェックの対象は氏名の2カラムということになります。

テストデータの挿入

次に、INSERTコマンドを使っていくつかのレコードを挿入します。意図的に同じ氏名のデータを複数登録しておきます。

mysql> insert into DuplicateDemo values(1,'John','Smith');
Query OK, 1 row affected (0.13 sec)

mysql> insert into DuplicateDemo values(2,'Mike','Jones');
Query OK, 1 row affected (0.28 sec)

mysql> insert into DuplicateDemo values(3,'David','Smith');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DuplicateDemo values(4,'Carol','Taylor');
Query OK, 1 row affected (0.20 sec)

mysql> insert into DuplicateDemo values(5,'David','Smith');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DuplicateDemo values(6,'John','Smith');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DuplicateDemo values(7,'John','Taylor');
Query OK, 1 row affected (0.15 sec)

登録データの確認

SELECT文ですべてのレコードを表示して、登録内容を確認しましょう。

mysql> select *from DuplicateDemo;

実行結果は以下の通りです。

+-----------+------------------+-----------------+
| StudentId | StudentFirstName | StudentLastName |
+-----------+------------------+-----------------+
| 1         | John             | Smith           |
| 2         | Mike             | Jones           |
| 3         | David            | Smith           |
| 4         | Carol            | Taylor          |
| 5         | David            | Smith           |
| 6         | John             | Smith           |
| 7         | John             | Taylor          |
+-----------+------------------+-----------------+
7 rows in set (0.00 sec)

見ての通り、「John Smith」と「David Smith」がそれぞれ2件ずつ登録されています。

重複データを抽出するクエリ

いよいよ、氏名の2カラムを組み合わせた重複チェックを実行します。

mysql> select StudentFirstName,StudentLastName,count(*) as Total from DuplicateDemo
-> group by StudentFirstName,StudentLastName
-> having count(*) > 1;

実行結果は以下の通りです。

+------------------+-----------------+-------+
| StudentFirstName | StudentLastName | Total |
+------------------+-----------------+-------+
| John             | Smith           | 2     |
| David            | Smith           | 2     |
+------------------+-----------------+-------+
2 rows in set (0.00 sec)

結果の解説

この結果から、「John Smith」と「David Smith」の組み合わせがそれぞれ2件存在することが判明しました。なお、「John Taylor」は1件のみなので、重複としては検出されていません。このように、指定したすべてのカラムの値が完全に一致するレコードだけが重複として抽出されます。

まとめ

  • 重複チェックにはGROUP BYHAVING COUNT(*) > 1の組み合わせを使う
  • 複数カラムを指定すれば、その全カラムが一致するレコードのみが抽出される
  • COUNT(*)に別名を付けて件数を表示すると、結果が読み取りやすくなる

この手法は、データクレンジングやマスターデータの品質管理など、さまざまな場面で活用できます。ぜひ実際のプロジェクトでも試してみてください。

  1. MySQLで複数の列を持つテーブルに条件を作成する方法|IF()関数の使い方を解説

    MySQLで条件分岐を実現するIF()関数とはMySQLで条件に応じて異なる値を返したい場合は、IF()関数を使用します。IF()関数は、指定した条件が真の場合と偽の場合で、それぞれ異なる値を返すことができる便利な関数です。IF()関数の基本構文IF(yourCondition, trueStatement, falseStatement);第1引数に条件式を指定し、条件が真(true)の場合は第2引数の値を、偽(false)の場合は第3引数の値を返します。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable612 (N

  2. 1つのMySQLクエリで複数のカラムのデータ型を変更する方法

    MySQLでは、ALTER TABLE文を使うことで、テーブルのカラム定義を後から変更できます。複数のカラムのデータ型を一度に変更したい場合も、1つのクエリでまとめて実行可能です。基本構文単一のクエリで複数のカラムの型を変更するには、以下のように MODIFY COLUMN をカンマで区切って並べます。ALTER TABLE テーブル名 MODIFY COLUMN カラム名1 データ型1, MODIFY COLUMN カラム名2 データ型2, . . N;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable (