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

MySQLのGROUP BYとHAVINGを使って、重複しないIDを持つレコードだけを表示する方法

MySQLでは、GROUP BY句とHAVING句を組み合わせることで、テーブル内に1回しか出現しない(重複していない)値を持つレコードだけを簡単に抽出できます。本記事では、サンプルテーブルを作成し、実際にクエリを実行しながらその手順を解説します。

1. サンプルテーブルの作成

まず、以下のようにテーブルを作成します。

mysql> create table DemoTable
(
   Id int,
   ColorName varchar(100)
);
Query OK, 0 rows affected (0.56 sec)

2. テストデータの挿入

続いて、INSERTコマンドを使ってレコードをいくつか挿入します。意図的に同じIdを複数回登録している点に注目してください。

mysql> insert into DemoTable values(100,'Red');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(101,'Green');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(101,'Blue');
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable values(102,'Yellow');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(100,'Purple');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(100,'Black');
Query OK, 1 row affected (0.26 sec)

3. 登録済みレコードの確認

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

mysql> select *from DemoTable;

実行すると、次のような結果が得られます。

+------+-----------+
| Id   | ColorName |
+------+-----------+
|  100 | Red       |
|  101 | Green     |
|  101 | Blue      |
|  102 | Yellow    |
|  100 | Purple    |
|  100 | Black     |
+------+-----------+
6 rows in set (0.00 sec)

この結果を見ると、Id「100」は3件、「101」は2件登録されており、Id「102」だけが1件のみ存在することがわかります。

4. 重複しないIDのレコードを抽出するクエリ

ここで本題です。重複していないIdを持つレコードのみを表示するには、サブクエリ内でGROUP BYとHAVINGを使用し、出現回数が1回(count(*) < 2)のIdだけを条件に指定します。

mysql> select *from DemoTable
where Id in(select Id from DemoTable group by Id having count(*) < 2);

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

+------+-----------+
|   Id | ColorName |
+------+-----------+
|  102 | Yellow    |
+------+-----------+
1 row in set (0.07 sec)

クエリの仕組み

このクエリは次のような流れで動作します。

  • GROUP BY Id:Idごとにレコードをグループ化します。
  • HAVING count(*) < 2:グループ内のレコード数が1件未満(=1件のみ)のグループ、すなわち重複していないIdだけを残します。
  • WHERE Id IN (...):その条件に合致したIdを持つ元テーブルのレコードを最終的に取得します。

このようにGROUP BYとHAVINGを活用すれば、重複データの検出や一意なレコードの抽出を柔軟に行うことができます。

  1. MySQLで列の値と任意のテキストを連結して1つの列に表示する方法

    MySQLで列の値とテキストを連結する方法MySQLでは、CONCAT()関数を使用することで、テーブルの列の値と任意のテキストを連結し、結果を1つの列として表示できます。本記事では、サンプルテーブルを作成し、実際に文字列を連結して表示するまでの手順を具体例とともに解説します。1. テーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> );Query OK, 0 rows affected (0.93 sec)こ

  2. MySQLでAND・OR演算子を組み合わせた単一クエリを使って特定のレコードを取得する方法

    MySQLでは、AND演算子とOR演算子をWHERE句で組み合わせることで、複数の条件を指定しながら特定のレコードを1つのクエリで取得できます。本記事では、実際にテーブルを作成し、データを挿入して、AND・ORを組み合わせたクエリの動作を確認していきます。 1. テーブルの作成 まず、CREATE TABLE文でサンプル用のテーブルを作成します。 mysql> create table DemoTable2015 -> ( -> StudentId int, -> StudentName varchar(20), -> Stude