DISTINCTとGROUP BY句はどちらも、列の重複を排除するという点で同じ動作をします。例えば、以下2つのSQLの結果はまったく同じです。

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

NULLの扱い(NULLをひとつにまとめる点)も、複数列を対象に集約する場合も結果はまったく同じです。それならば処理速度に差があるのかと思いきや、どちらもほぼ同じであり、違いが見当たりません。

DISTINCTとGROUP BYの使い分け

実は、このようにDISTNICTとGROUP BYの違いを探すことに意味はありません。

では、どのように使い分ければ良いかということですが、それはSELECT文で抽出したいデータの要件に合致しているかどうかを考えれば簡単です。

「選択結果から重複行を取り除きたい」という要件にはDISTINCTを使い、「集約した結果を求めたい」という要件にはGROUP BY句を使うという基本的な考え方で使い分ければ良いです。

このように考えると、COUNTなどの集約関数を使わずにGROUP BY句だけを使うようなSELECT文は、意味的におかなしな使い方ということになります。何のためにグループ化したのか、必要性が不明だからです。

つまり、上記2つのSELECT文のうち、2つ目の集約関数を使わずGROUP BY句でグループ化しているだけのSELECT文は、意味的におかしく、重複行を取り除きたいのであれば、1つ目のSELECT文を使うのが正しいということになります。