MySQLのDISTINCTで重複データを削除して取得する方法!
データベースで重複したデータが多く、重複したデータは1つにまとめて表示させたいということがあります。DISTINCTを使うことで重複したデータは取り除いて取得できます。この記事ではMySQLのDISTINCTで重複データを削除して取得する方法を紹介しています。
データベースを扱う際に重複したデータが多いとデータが見づらく、重複したデータを削除して1つ(ユニーク)の状態で表示したいということはよくあります。
そこでMySQLでは重複したデータを削除したい場合にはDISTINCT
を使います。
MySQLのDISTINCTとは?
DISTINCT
は重複したデータを取り除くことができます。
重複したデータを除外した重複なしの状態で表示を行います。そのため、データベース上のデータが実際に削除されたりするわけではないので注意してください。
MySQLのDISTINCTの使い方
それではDISINCT
の使い方を見ていきましょう。
カラムが1つの場合
まずはusers
テーブルを用意して、下記のようなデータを追加しました。
mysql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| users |
+------------------+
mysql> DESC users;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | YES | | NULL | |
| email | varchar(30) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
mysql> SELECT * FROM users;
+----+--------+--------------------+------+------------+------------+
| id | name | email | age | created_at | updated_at |
+----+--------+--------------------+------+------------+------------+
| 1 | taro | taro@example.com | 22 | NULL | NULL |
| 2 | hanako | hanako@example.com | 20 | NULL | NULL |
| 3 | jiro | jiro@example.com | 34 | NULL | NULL |
| 4 | taro | taro2@example.com | 29 | NULL | NULL |
| 5 | jiro | jiro2@example.com | 18 | NULL | NULL |
| 6 | yuriko | yuriko@example.com | 10 | NULL | NULL |
+----+--------+--------------------+------+------------+------------+
ユニークな値を持つ自動増分キーid
カラムを設定しているのでレコードの全体の重複を避けることはできていますが、name
カラムの値が重複しているレコードがいくつか見ることができますね。
分かりやすいようにname
カラムだけ抽出してみましょう。
mysql> SELECT name FROM users;
+--------+
| name |
+--------+
| taro |
| hanako |
| jiro |
| taro |
| jiro |
| yuriko |
+--------+
taro
やjiro
が複数存在しているがわかります。この重複した値をDISTINCT
で取り除いた状態で表示してみたいと思います。
mysql> SELECT DISTINCT name FROM users;
+--------+
| name |
+--------+
| taro |
| hanako |
| jiro |
| yuriko |
+--------+
DISTINCT
を使うことで重複した値をまとめることができました。
使い方はSELECT
句の後にDISTINCT
を記述することで重複した値はまとめて、ユニークな値のみを表示するようにすることが出来ます。
カラムが複数の場合
次はDISTINCT
を用いて重複した値を取り除くとき、複数カラムを指定した場合にはどうなるかを見ていきましょう。
product
テーブルを作成して、下記のようにデータを追加しました。
mysql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| product |
| users |
+------------------+
mysql> DESC product;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| color | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
mysql> SELECT * FROM product;
+------+--------+
| name | color |
+------+--------+
| pen | red |
| book | black |
| pen | blue |
| pen | red |
| pen | orange |
| book | white |
| book | black |
+------+--------+
早速DISTINCT
でname
カラムとcolor
カラムを指定してみましょう。
mysql> SELECT DISTINCT name, color FROM product;
+------+--------+
| name | color |
+------+--------+
| pen | red |
| book | black |
| pen | blue |
| pen | orange |
| book | white |
+------+--------+
複数カラムで指定した場合、複数カラムの値全てが同じ値のレコードが重複して存在した場合それらのレコードは1つにまとめられます。
今回でいうとname
カラムとcolor
カラムがどちらも同じ値のレコードは1つにまとめられています。name
カラムが同じpen
という値でもcolor
カラムの値が違うものは別のレコードとして扱われ、どちらのレコードも表示されます。
