SQLには重複を排除する「DISTINCT」というキーワードがあります。一方、COUNTやSUMなどの集計関数で用いる「GROUP BY」でも重複を省くことができます。それなら「DISTINCT」は必要なく、全部「GROUP BY」でいいじゃないか?余計なものを覚えたくないよ。という方もいるでしょう。
ところが、「DISTINCT」と「GROUP BY」は適切に区別して利用しないと結果が違うパターンになることがあります。今回は結果が異なる例をご紹介し、適切にSQLが書けるように理解を深める共有になります。
DISTINCTとGROUP BYの明らかな違いを解説
DISTINCTは重複なしのユニーク値を返すキーワード
DISTINCTは重複を省いた結果を返すキーワードなので、ユニーク値が表示されます。例えば下記のようなデータがあったとします。
CATEGOLY | NAME |
---|---|
1 | りんご |
1 | りんご |
2 | みかん |
2 | みかん |
これをSQLのDISTINCTで重複を削除する構文は下記。
SELECT
DISTINCT CATEGOLY,NAME
FROM テーブル名
結果は下記。
CATEGOLY | NAME |
---|---|
1 | りんご |
2 | みかん |
GROUP BYを利用しても上記コードなら同じ結果が返ってくる
GROUP BYを利用した下記SQL文を書いても同じ結果が返ってきます。
SELECT
CATEGOLY,NAME
FROM テーブル名
GROUP BY ALL
結果は下記。
CATEGOLY | NAME |
---|---|
1 | りんご |
2 | みかん |
この結果からみると、DISTINCTもGROUP BYも同じでは?と思い込んでしまいます。では、次章で違いがわかる例をご紹介します。
DISTINCTとGROUP BYの結果が違う例
例えば、カテゴリ毎の数をカウントしようと思います。DISTINCTとGROUP BYの両方でSQLを書いてみます。
SELECT
COUNT(DISTINCT CATEGOLY) AS CATEGOLY_COUNT
,COUNT(DISTINCT NAME) AS CATEGOLYNAME_COUNT
FROM テーブル名
GROUP BY ALL
CCATEGOLY_COUNT | CATEGOLYNAME_COUNT |
---|---|
2 | 2 |
カテゴリは「りんご」と「みかん」の2つしかないので、上記表示になります。(意図した答え)
ところが、DISTINCTを使わずGROUP BYだけで対応する下記SQLを実行すると。
SELECT
COUNT(CATEGOLY) AS CATEGOLY_COUNT
,COUNT(NAME) AS CATEGOLYNAME_COUNT
FROM テーブル名
GROUP BY ALL
結果が異なります。
CCATEGOLY_COUNT | CATEGOLYNAME_COUNT |
---|---|
4 | 4 |
該当カラムにある値をカウントするだけで重複を省いてくれません。
つまり、このことからわかることは重複を省きたい場合はDISTINCTを強く意識しておく必要があるということです。
まとめ
DISTINCTとGROUP BYの違いについて解説いたしました。