SQLのSELECT文で用いられるDISTINCTの意味と使い方をわかりやすく1分で解説します。
参考 SQLとは?
DISTINCTはSELECTした結果から "重複するレコードを除外する" オプションです。


このページではDISTINCTの構文ルールや利用方法の注意点を解説します。難しい内容ではないので1分ほどでマスターできます。
プログラマー/システムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
参考 SELECT文の基本
SELECT:DISTINCTの構文ルール
-- 基本形 SELECT DISTINCT カラム名 FROM テーブル名; -- 複数のカラムに適用 SELECT DISTINCT カラム名1, カラム名2 FROM テーブル名;
- 位置:
DISTINCT
キーワードは、SELECT
文の直後に配置。 - 対象:
DISTINCT
は1つ以上のカラムに適用され、そのカラムの組み合わせに対してユニークなレコードを返します。 - 組み合わせ: 複数のカラムに
DISTINCT
を適用する場合、カラムの間にカンマ(,)を使用して区切る。

DISTINCTはSELECT句で指定するカラム名の前に記述します。
以下のテーブルから、"Department" 列を重複を除外したい場合のサンプルコードがこちら。

SELECT DISTINCT Department FROM MemberList;
"Department" 列の重複が削除され、以下の結果が得られます。


もし、DISTINCTを用いずに単純にSELECTした場合は以下の結果が得られます。
SELECT Department FROM MemberList;

NULLも1種類としてカウント
DISTINCTを用いた場合はNULL値も1種類のデータとしてカウントされます。
例えば、どこにも所属していない社員がいるような場合。

この場合、DISTINCTを用いるとNULLも消えずに選択されます。
SELECT DISTINCT Department FROM MemberList;


NULLを出力したくない場合は、WHERE句でNULLを除外するように指定しましょう。
DISTINCTで複数のカラムを指定する場合
DISTINCTは以下のように複数のカラムを指定することも可能です。
SELECT DISTINCT Name, Department FROM MemberList;

複数のカラムを指定する場合は、指定したカラムの組み合わせがすべて一意に決まるように重複が除かれます。

以上のように、Name列が "山田" かつDepartment列が "営業部" のように、組み合わせの結果が重複しているものが削除されるという点を押さえておきましょう。

初心者にとっては少しだけ難しいかもしれませんが、これだけ覚えればDISTINCTは完璧です。
DISTINCTは先頭のカラムの前にしか記述することができません。
例えば、これはNG例。
SELECT Number, DISTINCT Department FROM MemberList;

Department列の重複だけを削除したいと考えるとこのような使い方をしがちですが、これはSQLの構文ルール違反です。よくあるミスの1つです。
DISTINCTキーワードの注意点
DISTINCT
キーワードを使用する際の注意点について、サンプルコードを用いながらご説明します。
注意点1 パフォーマンス
DISTINCT
は重複するレコードを除外するため、内部的にはソートやグルーピングが行われることがあります。そのため、大量のデータが存在するテーブルに対して使用するとパフォーマンスが低下する可能性があります。- インデックスの有無や設計もパフォーマンスに影響します。
注意点2 結果の順序
DISTINCT
の後に続くカラムの順序は結果の表示順に影響しますが、ユニーク性の評価には影響しません。
-- 例1 SELECT DISTINCT column1, column2 FROM some_table; -- 例2 SELECT DISTINCT column2, column1 FROM some_table; -- 上記2つのSQLはユニークなレコードのセットは同じになりますが、結果の表示順は異なる可能性があります。

現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。是非この機会にブックマークを!
読者料典 【完全無料】SQL:初心者向け学習ロードマップ ←こちらから!