PostgreSQLのDISTINCT完全ガイド|SQLで重複データを除外する方法を初心者向けに解説
生徒
「データベースを見ていたら、同じ名前や同じ年齢が何回も出てきて混乱しました。これって普通なんですか?」
先生
「よくありますよ。データベースでは、同じ値を持つ行が複数入ることがあります。そんなときに使うのがDISTINCTです。」
生徒
「DISTINCTって何をするものなんですか?」
先生
「SELECTでデータを取り出すときに、同じ内容を一つにまとめて表示してくれる命令です。名簿で同じ名前を一回だけ読み上げるようなイメージですね。」
生徒
「パソコンをほとんど触ったことがなくても使えますか?」
先生
「大丈夫です。表を目で見て確認しながら、一つずつ説明します。」
1. PostgreSQLとSQLの基本をやさしく理解しよう
PostgreSQLは、たくさんのデータを表の形で保存できるデータベースです。データベースは、紙のノートや名簿をデジタル化したような箱だと考えてください。その箱の中身を操作するための言葉がSQLです。
SQLには、データを見るためのSELECT、追加するINSERT、変更するUPDATE、削除するDELETEなどがあります。今回解説するDISTINCTは、SELECTと一緒に使う命令で、表示されるデータの重複をなくす役割を持っています。
2. 重複データとは何かを具体例で理解する
重複データとは、同じ値が何度も出てくる状態のことです。例えば、年齢一覧を表示したときに、25歳が何行も表示される場合、それは重複している状態です。
まずは、usersテーブルの中身を見てみましょう。
id | name | age | email
---+------------+-----+-----------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 25 | ichiro@example.com
4 | 田中次郎 | 30 | jiro@example.com
5 | 山本美咲 | 19 | misaki@example.com
この表では、ageの25や19が複数回登場しています。このままSELECTすると、同じ年齢が何度も表示されます。
3. DISTINCTの基本的な使い方
DISTINCTは「区別する」「重複をなくす」という意味の英単語です。SQLでは、SELECT DISTINCT 列名 の形で使います。
SELECT DISTINCT age
FROM users;
このSQLを実行すると、年齢が重複しない形で表示されます。
age
----
25
19
30
紙の名簿で、年齢の種類だけを一覧にする感覚と同じです。同じ年齢は一回だけ表示されます。
4. DISTINCTとSELECTの違いを比べてみよう
次に、DISTINCTを使わない場合と使った場合を比べてみます。
SELECT age
FROM users;
age
----
25
19
25
30
19
このように、DISTINCTを使わないと、テーブルに入っている行の数だけ表示されます。DISTINCTを使うことで、一覧として見やすくなり、データの特徴をつかみやすくなります。
5. 複数の列にDISTINCTを使う方法
DISTINCTは一つの列だけでなく、複数の列をまとめて重複チェックすることもできます。
SELECT DISTINCT age, name
FROM users;
この場合、年齢と名前の組み合わせが同じ行だけが重複として扱われます。どちらか一方でも違えば、別の行として表示されます。
名簿で「名前と年齢のセット」が同じ人を一人として数えるイメージです。
6. DISTINCTとWHEREを組み合わせて使う
DISTINCTは、WHEREと一緒に使うこともできます。まず条件で絞り込み、その結果から重複を除外します。
SELECT DISTINCT age
FROM users
WHERE age >= 20;
age
----
25
30
20歳以上の人だけを対象にして、年齢の種類を一覧で表示しています。条件と重複除外を組み合わせることで、知りたい情報だけをすっきり確認できます。
7. DISTINCTを使うときの注意点
DISTINCTは便利ですが、すべての場面で使えばよいわけではありません。元のデータの行数を確認したいときや、一人ずつの詳細を見たいときには向いていません。
また、列が多くなるほど、どこが重複しているのか分かりにくくなります。初心者のうちは、一つか二つの列で使うことを意識すると理解しやすくなります。
8. DISTINCTはどんな場面で役立つのか
DISTINCTは、一覧表や集計前の確認で特に役立ちます。年齢の種類、都道府県の種類、カテゴリの一覧など、同じ値をまとめて見たいときに使います。
データベース操作に慣れてくると、「まずDISTINCTで中身を確認する」という使い方も増えてきます。初心者にとっては、データの全体像をつかむための心強い味方です。