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

MySQLで列に1回だけ出現する値の数を取得する方法

MySQLのテーブルで、ある列に1回だけ出現する値の数を取得したい場合は、GROUP BY句とHAVING句を組み合わせるのが効果的です。この記事では、実際にテーブルを作成し、データを挿入しながら、具体的な手順を解説していきます。

1. サンプルテーブルを作成する

まずは、動作確認用のシンプルなテーブルを作成しましょう。ここでは「Name」というvarchar型の列を1つだけ持つテーブルを定義します。

mysql> create table DemoTable
(
    Name varchar(20)
);
Query OK, 0 rows affected (0.55 sec)

2. テストデータを挿入する

次に、INSERTコマンドを使って複数のレコードを挿入します。意図的に同じ名前を重複させて登録している点に注目してください。

mysql> insert into DemoTable values('Larry');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Larry');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Larry');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Carol');
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values('Robert');
Query OK, 1 row affected (0.27 sec)

3. 登録したデータを確認する

SELECTコマンドでテーブルの中身を確認してみましょう。

mysql> select *from DemoTable;

実行すると、以下のように12件のレコードが表示されます。

+--------+
| Name   |
+--------+
| Larry  |
| Larry  |
| Sam    |
| Chris  |
| Sam    |
| Mike   |
| Sam    |
| Larry  |
| Mike   |
| Mike   |
| Carol  |
| Robert |
+--------+
12 rows in set (0.00 sec)

データを見ると、Larry(3回)・Sam(3回)・Mike(3回)は複数回出現していますが、Chris・Carol・Robertの3つはそれぞれ1回しか登場していません。

4. 1回だけ出現する値の数をカウントする

それでは本題です。「Name」列に1回だけ出現する値の個数を求めるには、以下のようなクエリを実行します。

mysql> SELECT COUNT(Name)
FROM (
    SELECT Name
    FROM DemoTable
    GROUP BY Name
    HAVING COUNT(*) = 1
) AS APPEAR_FIRST_TIME;

実行結果は次の通りです。

+-------------+
| COUNT(Name) |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)

クエリの仕組みを解説

このクエリは、次の2段階の処理で構成されています。

  • サブクエリ部分:GROUP BY Nameで名前ごとにグループ化し、HAVING COUNT(*) = 1によって「出現回数がちょうど1回」のグループだけを抽出します。この例では Chris、Carol、Robert の3行が該当します。
  • 外側のクエリ:抽出された結果セットに対してCOUNT(Name)を適用し、該当する値の総数を返します。

結果として「3」という数値が得られました。これは、Name列に1回だけ出現する値が3つ存在することを意味します。

このように、GROUP BYHAVINGを組み合わせたサブクエリを使えば、重複データの中から一意な値だけを簡単に集計できます。ログ分析やマスターデータの品質チェックなど、さまざまな場面で応用できるテクニックなので、ぜひ覚えておきましょう。

  1. 【MySQL】SUM()関数を使って単一クエリで特定の列値ごとの複数カウントを取得する方法

    特定の列値に基づくカウントを1つのMySQLクエリで複数取得するには、集計関数SUM()を活用します。MySQLでは「列 = 値」という条件式が真なら1、偽なら0を返すため、その結果をSUM()で合計することで、条件に一致する行数を数えられます。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1790 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Score int ); Query OK, 0 rows af

  2. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(