DISTINCTを使用すると、SELECTした結果の行に重複した行があれば、それを1行にまとめます。つまり、重複行を取り除くことができます。

まず、サンプルとして以下のデータが格納されたEmployees表を作成します。Employees表の作成方法については「本サイトを読み進めていく上での準備」を参照してください。

employee_idnameemailphone_numberhire_datejob_idsalarymanager_iddepartment_id
0001山田太郎aaa@abc.com000000000001984-4-1AD_PRES500000NULL0010
0002佐藤達弘bbb@abc.com111111111112002-11-1IT_PROG300000NULL0050
0003木村幸平ccc@abc.com222222222222014-4-1IT_PROG250000NULL0050
0004神埼恵美ddd@abc.com333333333332017-4-1ST_CLERK220000NULL0100
0004高木龍之介eee@abc.com444444444442017-10-1IT_PROG210000NULLNULL
0004青木和也fff@abc.com555555555552018-4-1ST_TRAIN210000NULLNULL

DISTINCT

例えば、Employees表からどんな職種IDが登録されているかを知りたい場合、単純にSELECTすると、重複した行があってもそのまま抽出されます。

SELECT job_id
FROM Employees;
実行結果
job_id
----------
AD_PRES
IT_PROG
IT_PROG
ST_CLERK
IT_PROG
ST_TRAIN
(6 行)

以下のようにSELECT句でDISTINCTというキーワードを付与することで、重複した行が取り除かれます。

SELECT DISTINCT job_id
  FROM Employees;
実行結果
job_id
----------
ST_CLERK
IT_PROG
AD_PRES
ST_TRAIN
(4 行)

すべての行がユニークであり、重複している行が取り除かれています。

NULLの扱い

DISTINCTを使用した際、NULLも1種類のデータとして扱われます。複数のNULLが登録されていた場合は、これも1つのNULLとしてまとめられます。

以下は、NULLを含む列にDISTINCTキーワードをつけた場合の例です。

SELECT DISTINCT department_id
  FROM Employees;
実行結果
department_id
---------------
0100

0010
0050
(4 行)

NULLも消えずに出力されていることがわかります。

複数の列に対して指定する

DISTINCTキーワードは複数の列に対しても指定することも可能です。
その場合は、指定したすべての列の一意な組み合わせが出力されます。複数列の中の特定の列だけを指定することはできません。つまり、複数の列を組み合わせてもなお重複する行のみが1つにまとめられます。

SELECT DISTINCT job_id, department_id
  FROM Employees;
実行結果
job_id | department_id
----------+---------------
ST_CLERK | 0100
IT_PROG |
AD_PRES | 0010
ST_TRAIN |
IT_PROG | 0050
(5 行)

job_id(職種ID)とdepartment_id(部門ID)列の組み合わせがまったく同じ行が、1つの行にまとめられます。

なお、DISTINCTキーワードは先頭の列名の前にしか記述できません。例えば、「name, DISTINCT job_id」とは書けません。

SELECT name, DISTINCT job_id
  FROM Employees;
実行結果
ERROR: "DISTINCT"またはその近辺で構文エラー
行 1: SELECT name, DISTINCT job_id