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 BYとHAVING COUNT(*) > 1の組み合わせを使う - 複数カラムを指定すれば、その全カラムが一致するレコードのみが抽出される
COUNT(*)に別名を付けて件数を表示すると、結果が読み取りやすくなる
この手法は、データクレンジングやマスターデータの品質管理など、さまざまな場面で活用できます。ぜひ実際のプロジェクトでも試してみてください。
-
MySQLで複数の列を持つテーブルに条件を作成する方法|IF()関数の使い方を解説
MySQLで条件分岐を実現するIF()関数とはMySQLで条件に応じて異なる値を返したい場合は、IF()関数を使用します。IF()関数は、指定した条件が真の場合と偽の場合で、それぞれ異なる値を返すことができる便利な関数です。IF()関数の基本構文IF(yourCondition, trueStatement, falseStatement);第1引数に条件式を指定し、条件が真(true)の場合は第2引数の値を、偽(false)の場合は第3引数の値を返します。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable612 (N
-
1つのMySQLクエリで複数のカラムのデータ型を変更する方法
MySQLでは、ALTER TABLE文を使うことで、テーブルのカラム定義を後から変更できます。複数のカラムのデータ型を一度に変更したい場合も、1つのクエリでまとめて実行可能です。基本構文単一のクエリで複数のカラムの型を変更するには、以下のように MODIFY COLUMN をカンマで区切って並べます。ALTER TABLE テーブル名 MODIFY COLUMN カラム名1 データ型1, MODIFY COLUMN カラム名2 データ型2, . . N;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable (