【SQL入門】DISTINCTで重複する値を処理

DISTINCTとは?

SELECTで選択したカラムに重複する値があった場合、
その重複を除外して結果を返してくれます。

実際に使ってみる

社員名と部署、年齢が格納されたテーブルを利用します。

社員名 部署 年齢
田中 営業 30
佐藤 経理 25
鈴木 営業 25
田中 総務 40
清水 経理 43

社員名と見ると”田中”が重複しております。
社員マスターから重複が無い社員名一覧を取得する際には、
どのようなクエリを書けば良いでしょうか。

実行クエリ

SELECT
    DISTINCT
    社員名
FROM
    社員マスター

実行結果

社員名
田中
佐藤
鈴木
清水

この通り、”田中”が1つになりましたね。

それでは、DISTINCTを利用して社員名と部署を抽出します。

実行クエリ

SELECT
    DISTINCT
    社員名,
    部署
FROM
    社員マスター

実行結果

社員名 部署
田中 営業
佐藤 経理
鈴木 営業
田中 総務
清水 経理

先程と結果が異なりましたね。
"田中"が2名重複したまま残っております。
残っている理由としては、"田中"だけでは単なる重複なのですが、
部署が異なるからです。

社員名 部署
田中 営業
田中 総務

一人の田中さんは営業で、もうひとりは総務です。
つまり、DISTINCTは、選択した絡むすべてを考慮して重複を排除するのです。

DISTINCTとGROUP BY

GROUP BYも、実はDISTINCTと同じことができます。
例えば、先程の社員マスターから「重複を排除した社員名」を抽出しようとした際、

DISTINCTの書き方

SELECT
    DISTINCT
    社員名
FROM
    社員マスター

GROUP BYの書き方

SELECT
    社員名
FROM
    社員マスター
GROUP BY
    社員名

このように、少し書き方は異なりますが、
両者同じ結果を返してくれます。

どちらを使うべきか?

DISTINCTは、重複を排除したいとき
GROUP BYは、カウントなどをしたいとき

そもそも、GROUP BYは重複を排除するのではなく、
テーブルのレコードごとにカウントしたり最大値を求めるために使います。

そのため、シンプルに重複を排除したいときには、
DISTINCTを使いましょう。

GROUP BYで重複排除したほうが良いとき

ただ、DISTINCTよりもGROUP BYを利用して
重複を排除したほうが良いときもあります。

HIVEを利用する際には、DISTINCTで重複を排除するよりも、
GROUP BYを利用したほうが処理は早くなります。

参考文献

入門者の方に非常におすすめの本になります。
今回のような入門テーマをわかりやすく解説してくれており、
練習問題までたくさん用意されているので、
SQLの習得に有用ではないかと思います。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)