SQLでデータを取得していると、「同じ値が何度も表示される」「一覧を作りたいだけなのに重複行が多い」といった状況に直面することがあります。そのようなときに使われる代表的な構文が DISTINCT です。
DISTINCT は非常に便利な一方で、仕組みを正しく理解せずに多用すると、処理速度の低下や意図しない結果を招く原因にもなります。本記事では、SQL DISTINCT の基本的な使い方から、適切な使用場面、注意すべきポイントまでを体系的に解説いたします。

DISTINCTとは何か
DISTINCT は、SELECT 文で取得した結果から重複行を除外するためのキーワードです。
同一の値を持つ行が複数存在する場合、それらを一つにまとめて表示します。
基本構文は以下のとおりです。
|
1 2 |
SELECT DISTINCT カラム名 FROM テーブル名; |
この構文を使用すると、指定したカラムの値が重複しない一覧を取得できます。
DISTINCTの基本的な使用例
単一カラムでの重複排除
たとえば、社員テーブルに部署名が登録されている場合、部署一覧だけを取得したいときは次のように記述します。
|
1 2 |
SELECT DISTINCT department FROM employees; |
この結果、同じ部署名が複数行に存在していても、一度だけ表示されます。
複数カラムを指定した場合の挙動
DISTINCT は、指定したすべてのカラムの組み合わせを基準に重複を判定します。
|
1 2 |
SELECT DISTINCT department, job_title FROM employees; |
この場合、「部署」と「職種」の組み合わせが完全に一致する行のみが重複とみなされます。
どちらか一方でも異なれば、別の行として扱われる点に注意が必要です。
DISTINCTの正しい使いどころ
マスタ的な一覧を取得したい場合
以下のような用途では、DISTINCT は非常に有効です。
- 部署一覧
- 商品カテゴリ一覧
- 都道府県名一覧
- ステータスコード一覧
これらは「同じ値が複数存在することが前提」であり、一覧表示では重複を排除したいケースがほとんどです。
データの傾向を確認したい場合
分析や調査の初期段階で、どのような値が存在するかを把握したいときにも DISTINCT は役立ちます。
|
1 2 |
SELECT DISTINCT status FROM orders; |
これにより、想定外のステータス値が登録されていないかを確認できます。
DISTINCTを使いすぎてはいけない理由
DISTINCT は便利ですが、常用すべき構文ではありません。以下の点に注意が必要です。
処理コストが高くなりやすい
DISTINCT は内部的に以下のような処理を行います。
- 全件を取得
- ソートまたはハッシュ処理
- 重複行を排除
データ量が多いテーブルでは、これだけで処理負荷が大きくなります。
特にインデックスが効かないケースでは、パフォーマンスに大きな影響を与えます。
本来不要なDISTINCTを付けてしまうケース
以下のようなSQLはよく見られる例です。
|
1 2 3 |
SELECT DISTINCT id, name FROM users WHERE id = 100; |
この場合、id が主キーであれば結果は必ず1件です。
DISTINCT を付けても意味はなく、単に無駄な処理を増やしているだけになります。
JOINと組み合わせた際の誤用
JOIN を行った結果、意図せず行が増えてしまい、それを隠すために DISTINCT を付けるケースがあります。
|
1 2 3 |
SELECT DISTINCT u.id, u.name FROM users u JOIN orders o ON u.id = o.user_id; |
このような書き方は、設計上の問題を見えなくしてしまいます。
本来は JOIN 条件や集約方法を見直すべきであり、DISTINCT は根本的な解決策ではありません。
DISTINCTを使用すると、重複排除のために内部的な処理が追加されるため、データ量が多い場合はSELECT文全体の実行速度に影響を与えることがあります。
もし「クエリが遅い」「以前よりレスポンスが悪くなった」と感じる場合は、DISTINCT以外の要因も含めて確認することが重要です。
DISTINCTとGROUP BYの違い
DISTINCT と GROUP BY は似た結果を返すことがありますが、目的が異なります。
DISTINCT
- 単純に重複行を排除する
- 集計を伴わない
GROUP BY
- 集計処理が前提
- 件数や合計、平均などを求める
単なる一覧取得であれば DISTINCT、集計が必要な場合は GROUP BY を選択するのが基本です。
DISTINCTが不要なケースを見極める
以下に該当する場合、DISTINCT は不要、もしくは使用を再検討すべきです。
- 主キーやユニーク制約を条件に含んでいる
- 件数が必ず1件になるWHERE句がある
- JOIN結果の行増加を誤魔化している
- パフォーマンス問題の原因になっている
SQLの意図を明確にし、「なぜ重複が出るのか」を理解することが重要です。
よくある質問(Q & A)
- DISTINCTはすべてのデータベースで使えますか?
-
はい。DISTINCT は SQL の標準構文であり、Oracle、MySQL、PostgreSQL、SQL Server など主要なデータベースで使用可能です。
- DISTINCTとORDER BYは同時に使えますか?
-
使用できます。ただし、ORDER BY に指定するカラムは SELECT 句に含める必要がある場合があります。データベースの仕様に注意してください。
- DISTINCTはインデックスを使いますか?
-
状況によります。単一カラムでインデックスが張られている場合は利用されることもありますが、複数カラムや関数を含む場合は使われないケースが多くなります。
- DISTINCTとCOUNTを組み合わせることはできますか?
-
可能です。
12SELECT COUNT(DISTINCT user_id)FROM orders;これは重複しないユーザー数を求める代表的な使い方です。
- DISTINCTを使わずに重複を防ぐ方法はありますか?
-
テーブル設計時にユニーク制約を設定する、JOIN条件を適切に設計するなど、根本的な対策が有効です。


