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

MySQLで特定の列に同じ値(重複データ)を持つ行を検索する方法

MySQLでは、GROUP BY句とHAVING句、そしてサブクエリを組み合わせることで、特定の列に同じ値が重複して存在する行だけを簡単に抽出できます。この記事では、実際にテーブルを作成し、重複データを挿入したうえで、重複行を検索する手順を解説します。

1. テーブルの作成

まず、サンプル用のテーブルを作成します。ここでは「Name」という列を1つ持つシンプルなテーブルを用意します。

mysql> create table RowValueDemo
   -> (
   -> Name varchar(100)
   -> );
Query OK, 0 rows affected (0.69 sec)

2. レコードの挿入

次に、INSERT文を使ってレコードを挿入します。この例では、意図的に同じ値(JohnとBob)を複数回登録しています。

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.14 sec)

mysql> insert into RowValueDemo values('Bob');
Query OK, 1 row affected (0.14 sec)

mysql> insert into RowValueDemo values('Carol');
Query OK, 1 row affected (0.11 sec)

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.24 sec)

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.09 sec)

mysql> insert into RowValueDemo values('John');
Query OK, 1 row affected (0.10 sec)

mysql> insert into RowValueDemo values('Bob');
Query OK, 1 row affected (0.09 sec)

mysql> insert into RowValueDemo values('Bob');
Query OK, 1 row affected (0.18 sec)

3. 登録された全レコードの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from RowValueDemo;

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

+-------+
| Name  |
+-------+
| John  |
| Bob   |
| Carol |
| John  |
| John  |
| John  |
| Bob   |
| Bob   |
+-------+
8 rows in set (0.00 sec)

全8件のうち、「Carol」以外の7件が重複していることがわかります。

4. 重複している行だけを抽出するクエリ

同じ値を持つ行のみを取得するには、次のようにサブクエリ内でGROUP BY句とHAVING句を使い、出現回数が2回以上の値を絞り込みます。

mysql> select * from RowValueDemo where Name in (
   ->  select Name from RowValueDemo
   ->  group by Name having count(*) > 1
   -> );

クエリのポイント

  • GROUP BY Name:Name列の値ごとに行をグループ化します。
  • HAVING count(*) > 1:グループ内の行数が2以上(=重複している)ものだけを対象にします。
  • WHERE Name IN (...):サブクエリで得られた重複する値に一致する行を外側のクエリが返します。

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

+------+
| Name |
+------+
| John |
| Bob  |
| John |
| John |
| John |
| Bob  |
| Bob  |
+------+
7 rows in set (0.06 sec)

このように、重複していない「Carol」が除外され、同じ値を持つ7行だけが取得できました。WHERE句ではなくHAVING句で条件を指定するのがポイントです。WHERE句は集計前の個々の行に対するフィルタである一方、HAVING句はGROUP BYによる集計後の結果に対して条件を適用できるためです。

  1. MySQLのVARCHAR型カラムから最大値を正しく取得する方法

    VARCHAR型(文字列型)のカラムに対してそのまま MAX() 関数を使用すると、値は文字列として比較されるため、「8」「901」「10001」のような数値的な大小関係が正しく評価されません。そこで、CAST() を使って値を数値型に変換してから MAX() を適用することで、正確な最大値を取得できます。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable2030 -> ( -> Value varchar(20) -> ); Query OK, 0 row

  2. MySQLで列の最大値を取得する方法をわかりやすく解説

    MySQLで特定の列の最大値を取得するには、MAX(columnName)関数を使用します。本記事では、その基本的な使い方に加えて、データベースやテーブルの設計に関する前提知識もあわせて解説します。MySQLのデータベースとテーブルの基礎MySQLをインストールする前に、まず使用するバージョンと配布形式(バイナリファイルか、ソースファイルからビルドするか)を決定することが重要です。新しく作成したばかりのデータベースには、当然ながらテーブルはまだ存在しません。データベース設計において最も重要なのは、以下の要素を決めることです。データベース全体の構造必要となるテーブルの一覧各テーブルに含まれる列(