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

MySQLで重複する値の表示を回避する方法|GROUP BYとCOUNTを使ったクエリ

MySQLでテーブル内のデータを取得する際、「1回しか出現しない値(重複していない値)だけを表示したい」というケースがあります。そのような場合に活用できるのが、GROUP BY句COUNT関数、そしてHAVING句を組み合わせたクエリです。

基本構文

GROUP BYでカラムごとにレコードをグループ化し、HAVING句で「出現回数が1回」のグループだけを抽出します。基本構文は以下の通りです。

SELECT yourColumnName FROM yourTableName GROUP BY yourColumnName HAVING COUNT(*) = 1;

それでは、実際にサンプルテーブルを作成して動作を確認してみましょう。

サンプルテーブルの作成

まずは、IdとSubjectという2つのカラムを持つテーブルを作成します。

mysql> CREATE TABLE DemoTable
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Subject varchar(100)
    -> );
Query OK, 0 rows affected (0.70 sec)

レコードの挿入

次に、INSERT文を使っていくつかのレコードを挿入します。意図的に同じ科目(MongoDB、Java、C)を複数回登録している点に注目してください。

mysql> INSERT INTO DemoTable(Subject) VALUES('MySQL');
Query OK, 1 row affected (0.21 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('MongoDB');
Query OK, 1 row affected (0.14 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('Java');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('MongoDB');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('C');
Query OK, 1 row affected (0.13 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('C++');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('Java');
Query OK, 1 row affected (0.14 sec)

mysql> INSERT INTO DemoTable(Subject) VALUES('C');
Query OK, 1 row affected (0.23 sec)

登録データの確認

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

mysql> SELECT * FROM DemoTable;

出力結果

+----+---------+
| Id | Subject |
+----+---------+
| 1  | MySQL   |
| 2  | MongoDB |
| 3  | Java    |
| 4  | MongoDB |
| 5  | C       |
| 6  | C++     |
| 7  | Java    |
| 8  | C       |
+----+---------+
8 rows in set (0.00 sec)

このように、全8件のレコードの中に「MongoDB」「Java」「C」がそれぞれ2回ずつ含まれていることが確認できます。

重複する値を除外するクエリ

ここで本題のクエリです。GROUP BYでSubjectごとにグループ化し、HAVING COUNT(*) = 1 を指定することで、重複していない値だけを取り出せます。

mysql> SELECT Subject FROM DemoTable GROUP BY Subject HAVING COUNT(*) = 1;

出力結果

+---------+
| Subject |
+---------+
| MySQL   |
| C++     |
+---------+
2 rows in set (0.00 sec)

実行結果を見ると、テーブル内で1回しか登場していない「MySQL」と「C++」だけが表示されました。2回以上出現した「MongoDB」「Java」「C」は正しく除外されています。

まとめ

  • GROUP BY:指定したカラムの値ごとにレコードをグループ化する
  • COUNT(*):各グループに含まれるレコード数をカウントする
  • HAVING COUNT(*) = 1:出現回数が1回だけのグループ(=重複していない値)に絞り込む

なお、逆に「重複している値だけ」を抽出したい場合は、条件を HAVING COUNT(*) > 1 に変更するだけで対応できます。用途に応じて条件を変えることで、柔軟にデータを分析できるので、ぜひ覚えておきましょう。

  1. 【MySQL】空の値(空文字列)をNULLに変換するUPDATEクエリの書き方

    MySQLでは、UPDATE文のSET句とWHERE句を組み合わせるだけで、カラムに入っている空の値(空文字列)をNULLへ簡単に変換できます。ここからは、実際のサンプルを使って手順を詳しく解説していきます。 1. サンプルテーブルを作成する まず、以下のコマンドでテーブルを作成しましょう。 mysql> create table DemoTable1315 -> ( -> CountryName varchar(10) -> ); Query OK, 0 rows affected (0.60 sec) 2. レコードを挿入する 次に、INSERTコマンドでレコー

  2. MySQLでグループごとの最小値を複数取得するクエリの書き方

    MySQLで「名前ごとなど、グループ単位の最小値」を一度に取得したい場面はよくあります。そんなときは、サブクエリとMIN()関数を組み合わせることで簡単に実現できます。この記事では、各人物の最も低いスコアを抽出する具体的手順を、テーブル作成から順に解説します。 サンプルテーブルの作成 まず、CREATE TABLE文でテスト用のテーブルを作成します。 mysql> create table DemoTable     -> (     -> Name varchar(20),  &nbs