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 に変更するだけで対応できます。用途に応じて条件を変えることで、柔軟にデータを分析できるので、ぜひ覚えておきましょう。
-
【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コマンドでレコー
-
MySQLでグループごとの最小値を複数取得するクエリの書き方
MySQLで「名前ごとなど、グループ単位の最小値」を一度に取得したい場面はよくあります。そんなときは、サブクエリとMIN()関数を組み合わせることで簡単に実現できます。この記事では、各人物の最も低いスコアを抽出する具体的手順を、テーブル作成から順に解説します。 サンプルテーブルの作成 まず、CREATE TABLE文でテスト用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Name varchar(20), &nbs