こんにちは、かつコーチです。
「注文テーブルから、注文したことがある都道府県の一覧が欲しい」。
こういう場面で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;
DISTINCTはSELECTの直後、カラム名の前に置きます。
これだけで、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, 初心者向け, 基本文法