【SQL】DISTINCTで重複を除去する

SQL

こんにちは、かつコーチです。

「注文テーブルから、注文したことがある都道府県の一覧が欲しい」。
こういう場面でSELECT文をそのまま書くと、同じ都道府県が注文件数分だけ何度も表示されてしまいます。

この記事では、結果から重複行を取り除くDISTINCTの使い方を、ordersテーブルを例に解説します。

DISTINCTとは?

重複した行をまとめる構文

DISTINCTとは、SELECT文の結果から重複する行を取り除き、ユニークな(一意な)行だけを返す構文です。
SELECTの直後に書くだけで使えるシンプルな構文ですが、集計や分析の場面で頻繁に登場します。

なぜDISTINCTが必要なのか

例えば、次のようなordersテーブルがあるとします。

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(50),
    prefecture VARCHAR(20),
    product_name VARCHAR(50)
);

このテーブルからprefectureだけをSELECTすると、注文件数がそのまま行数になるため、同じ都道府県が何十行も並ぶ結果になります。
「注文実績のある都道府県は何種類あるか」を知りたいだけなら、これは無駄が多く扱いにくい結果です。
DISTINCTを使うことで、重複を除いた「種類」だけを一目で確認できます。

基本の書き方

手順1:単一カラムの重複を除去する

SELECT DISTINCT prefecture FROM orders;

DISTINCTSELECTの直後、カラム名の前に置きます。
これだけで、prefecture列に同じ値が何行あっても、結果には1行しか表示されなくなります。

手順2:複数カラムを組み合わせて重複を除去する

DISTINCTは複数のカラムを指定することもできます。

SELECT DISTINCT prefecture, product_name FROM orders;

この場合、「都道府県」と「商品名」の組み合わせが重複している行だけがまとめられます。
片方のカラムだけが一致していても、もう片方が異なれば別の行として扱われる点に注意してください。

手順3:COUNTと組み合わせて件数を数える

「重複を除いた件数」を知りたい場合は、DISTINCTとCOUNTを組み合わせます。

SELECT COUNT(DISTINCT prefecture) AS prefecture_count FROM orders;

これは「注文実績のある都道府県は何種類あるか」を1回のクエリで求められる、実務でよく使う書き方です。

つまずきやすい設定・注意点

DISTINCTが効いていないように見える

❌ Before:複数カラムを指定していることに気づかず、重複が消えないと勘違いする

SELECT DISTINCT customer_name, prefecture FROM orders;

私が実際にこの書き方で「DISTINCTが効いていない」と困ったことがあります。
原因は、同じcustomer_nameでも注文ごとにprefectureが微妙に違う表記(「東京都」と「東京」など)で登録されていたことでした。
DISTINCTは文字列を一字一句比較して判定するため、表記ゆれがあると別の値として扱われ、重複として除去されません。

✅ After:意図に応じてカラムを絞り込む、または事前にデータを正規化しておく

SELECT DISTINCT customer_name FROM orders;

「顧客名だけの重複を除きたいのか」「顧客名と都道府県の組み合わせで重複を除きたいのか」を明確にしてからカラムを指定することが重要です。
表記ゆれが疑われる場合は、TRIMやUPPERといった文字列関数で正規化してから比較すると、意図した結果に近づきます。

DISTINCTと集計関数の順序

DISTINCTは基本的にSELECTの先頭に1回だけ書きます。
SELECT DISTINCT prefecture, DISTINCT product_nameのように複数回書くとエラーになるため、対象カラムをまとめて1つのDISTINCTで指定するようにしましょう。

❌ SELECT DISTINCT prefecture, DISTINCT product_name FROM orders;
✅ SELECT DISTINCT prefecture, product_name FROM orders;

応用・一歩先の使い方

GROUP BYとの使い分け

重複除去という意味では、DISTINCTと似た結果をGROUP BYでも作れます。

SELECT prefecture FROM orders GROUP BY prefecture;

単純な重複除去だけならDISTINCTの方が意図が伝わりやすく、集計関数(SUMやAVGなど)と組み合わせてグループごとの計算をしたい場合はGROUP BYを使う、という使い分けが基本です。
GROUP BYの詳しい使い方は、このシリーズの後続記事で扱います。

DISTINCTのパフォーマンスへの影響

DISTINCTは、内部的にはすべての行を比較して重複を判定する処理を行うため、対象データが大量になるほど処理コストが上がります。
本当に重複除去が必要なカラムだけを指定し、不要なカラムまで含めてDISTINCTをかけないようにすることが、パフォーマンスを保つコツです。

まとめ

この記事のポイント

  • DISTINCTはSELECT結果から重複する行を取り除く構文
  • 複数カラムを指定すると、その組み合わせ単位で重複を判定する
  • COUNT(DISTINCT カラム名)で「重複を除いた件数」を求められる
  • 表記ゆれがあるとDISTINCTで重複が除去されないことがあるため注意する

次に読むべき記事

  • SQL 集計関数(COUNT・SUM・AVG・MAX・MIN)の使い方
  • SQL GROUP BY 使い方

タグ: SQL, 初心者向け, 基本文法

タイトルとURLをコピーしました