支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • 【基本】SQLで重複したデータを取得

DISTINCTとは

DISTINCTとは、SELECT 文を使ってデータを取得する際に指定すると、取得するカラムの値が重複してしまっているデータをまとめて一件のデータとして取得することができます。 そのため、データを取得したいときのみ重複しているデータをまとめることができるので、データベース上の重複しているデータを直接削除はしたくない場合に便利なコマンドです。

DISTINCTの基本的な書式

DISTINCTの基本的な書き方は以下の通りです。 SELECT DISTINCT カラム名[,カラム名...] FROM テーブル名; 通常のSELECT文で、重複データがあるか調べたいカラム名とテーブル名を指定し、その中にDISTINCTを記述することによって、重複しているデータを除外して指定したデータを取得することができます。

DISTINCTの使用例

DISTINCTの書式が確認できたところで、具体的にテーブルを作成し確認していきましょう。 まずは、使用するテーブルとして商品情報を管理する「itemsテーブル」を作成します。 CREATE TABLE items (id int, name varchar(10), price int,category varchar(10)); 上記のusersテーブルが作成できたら、データの格納を行います。

INSERT INTO items VALUES (1, 'りんご', 100,'果物'); INSERT INTO items VALUES (2, 'にんじん', 200,'野菜'); INSERT INTO items VALUES (3, 'りんご', 100,'果物'); INSERT INTO items VALUES (4, '洗剤', 200,'日用品'); INSERT INTO items VALUES (5, 'ティッシュペーパー', 300,'日用品'); INSERT INTO items VALUES (6, 'たまねぎ', 200,'野菜'); INSERT INTO items VALUES (7, 'にんじん', 200,'野菜'); INSERT INTO items VALUES (8, 'パイナップル', 400,'果物');

ここまで作成すると以下のような表になります。

id name price category
1 りんご 100 果物
2 にんじん 200 野菜
3 りんご 100 果物
4 洗剤 200 日用品
5 ティッシュペーパー 300 日用品
6 たまねぎ 200 野菜
7 にんじん 200 野菜
8 パイナップル 400 果物

ここからはSELECT文を使用してnameカラムとpriceカラムを抜き出します。 では、DISTINCTを使用する場合としない場合を比較してみましょう。

・DISTINCTを使用しない場合

SELECT name,price FROM users; 【実行結果】

                                 
nameprice
りんご100
にんじん200
りんご100
洗剤200
ティッシュペーパー300
たまねぎ200
にんじん200
パイナップル400
上記の実行結果をみるとわかるように、DISTINCTを使用しない場合は指定したカラムに重複データがあっても、 重複したまま格納されているデータを取得します。 この重複したデータをデータベースから削除はせずに取得できるのがDISTINCTです。

・DISTINCTを使用した場合

SELECT DISTINCT name,price FROM items; 【実行結果】

                         
nameprice
りんご100
にんじん200
洗剤200
ティッシュペーパー300
たまねぎ200
パイナップル400
DISTINCTを使用した場合、重複データは一つのデータにまとめられ取得されます。 そのため、例では「りんご」と「にんじん」が1つずつデータが出力されるようになります。 また、今回は2つのカラムを使用して確認をしましたが、1つのカラムでも確認可能です。

データベース上の重複データの削除

ここまでは重複したデータをSELECTとDISTINCTで削除し取得するという内容でしたが、データベースのデータ自体の削除を行いたい場合もご紹介していきます。 ここでも先ほどのデータベースのデータを使用します。

id name price category
1 りんご 100 果物
2 にんじん 200 野菜
3 りんご 100 果物
4 洗剤 200 日用品
5 ティッシュペーパー 300 日用品
6 たまねぎ 200 野菜
7 にんじん 200 野菜
8 パイナップル 400 果物
ここで削除したいのが、重複しているitem_idが3の「りんご」と7の「にんじん」です。 重複したデータベース内のデータの削除は様々な方法がありますが、今回使用するのは以下のような「DELETE文」です。 DELETE FROM items WHERE id NOT IN (SELECT min_id from (SELECT MIN(id) min_id FROM items GROUP BY name, price,category) tmp); idが小さいものから確認し、その中でその他の指定したカラムと重複しているものがあればDELETEを使用して削除するようなSQL文です。 これを実行すると下記のような結果になります。 【実行結果】
id name price category
1 りんご 100 果物
2 にんじん 200 野菜
4 洗剤 200 日用品
5 ティッシュペーパー 300 日用品
6 たまねぎ 200 野菜
8 パイナップル 400 果物
3の「りんご」、7の「にんじん」のデータが削除されます。 また、idは削除されたデータ分繰り上げはされないので注意が必要です。

まとめ

いかがでしたでしょうか? データベースにおいてデータの削除は間違えてしまうとデータが消えてしまい取り返しのつかないことにもなりかねません。 データの削除をする場合には、よく確認し準備を十分にして作業をすることをおすすめします。