この記事では、《重複レコード削除》について、
業務を通して学習した内容を、備忘録としてまとめています。
- 『GROUP BY』と『DISTINCT』使うべきはどちらなのか…?
についてまとめています。
※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。
背景
重複レコードをまとめる時に…
『GROUP BY
と DISTINCT
どちらを使えばいいのか・・・?』
と疑問に思ったので、調べてみました。
【疑問】 使うべきはどちらなのか…?
-
DISTINCT
➡︎ テーブルから取得した結果から、重複している行を削除したい時に使う。 -
GROUP BY
➡︎ テーブルから取得した結果をグループ化して、集計したい時に使う。
つまり・・・
- 単に、重複を除いた結果を取得する場合は
DISTINCT
句 - まとめ結果に対して、何らかの処理を加える必要がある場合は
GROUP BY
句
ということになります。
last_name | first_name |
---|---|
山田 | 太郎 |
山田 | 太郎 |
山田 | 太郎 |
山田 | 次郎 |
山田 | 次郎 |
山田 | 三郎 |
例えば・・・
上記のテーブルから同姓同名のレコードを1レコードに集約する場合…
SELECT
last_name,
first_name
FROM
table_xxx
GROUP BY
last_name,
first_name;
上記ようなクエリではなく…
SELECT DISTINCT
last_name,
first_name
FROM
table_xxx;
上記のクエリにすべきです。
last_name | first_name |
---|---|
山田 | 太郎 |
山田 | 次郎 |
山田 | 三郎 |
では、GROUP BY
はどう使うのか…?
➡︎ まとめたレコードを集計する場合に使う
last_name | first_name |
---|---|
山田 | 太郎 |
山田 | 太郎 |
山田 | 太郎 |
山田 | 次郎 |
山田 | 次郎 |
山田 | 三郎 |
例えば・・・
上記のテーブルから同姓同名のレコードを集計する場合は、以下のように記述します。
SELECT
last_name,
first_name,
COUNT(*) AS '人数'
FROM
table_xxx
GROUP BY
last_name,
first_name;
last_name | first_name | 人数 |
---|---|---|
山田 | 太郎 | 3 |
山田 | 次郎 | 2 |
山田 | 三郎 | 1 |
まとめ
-
DISTINCT
➡︎ テーブルから取得した結果から、重複している行を削除したい時に使う。 -
GROUP BY
➡︎ テーブルから取得した結果をグループ化して、集計したい時に使う。
【余談】
DISTINCT
は、用途ははっきりしていますが…
使えるタイミングが限定的で、使用する機会はそれほど多くないと思います