【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問付き! (スッキリシリーズ)
- 作者: 中山清喬,飯田理恵子,株式会社フレアリンク
- 出版社/メーカー: インプレス
- 発売日: 2018/11/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る