SQLのDISTINCTとGROUP BYの違いが最もわかる例

SQL DISTINCTとGROUP BYの違い

SQLには重複を排除する「DISTINCT」というキーワードがあります。一方、COUNTやSUMなどの集計関数で用いる「GROUP BY」でも重複を省くことができます。それなら「DISTINCT」は必要なく、全部「GROUP BY」でいいじゃないか?余計なものを覚えたくないよ。という方もいるでしょう。

ところが、「DISTINCT」と「GROUP BY」は適切に区別して利用しないと結果が違うパターンになることがあります。今回は結果が異なる例をご紹介し、適切にSQLが書けるように理解を深める共有になります。

目次

DISTINCTとGROUP BYの明らかな違いを解説

DISTINCTは重複なしのユニーク値を返すキーワード

DISTINCTは重複を省いた結果を返すキーワードなので、ユニーク値が表示されます。例えば下記のようなデータがあったとします。

CATEGOLYNAME
1りんご
1りんご
2みかん
2みかん

これをSQLのDISTINCTで重複を削除する構文は下記。

SELECT
  DISTINCT CATEGOLY,NAME
FROM テーブル名

結果は下記。

CATEGOLYNAME
1りんご
2みかん

GROUP BYを利用しても上記コードなら同じ結果が返ってくる

GROUP BYを利用した下記SQL文を書いても同じ結果が返ってきます。

SELECT
  CATEGOLY,NAME
FROM テーブル名
GROUP BY ALL

結果は下記。

CATEGOLYNAME
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_COUNTCATEGOLYNAME_COUNT
22

カテゴリは「りんご」と「みかん」の2つしかないので、上記表示になります。(意図した答え)

ところが、DISTINCTを使わずGROUP BYだけで対応する下記SQLを実行すると。

SELECT
  COUNT(CATEGOLY) AS CATEGOLY_COUNT
,COUNT(NAME) AS CATEGOLYNAME_COUNT
FROM テーブル名
GROUP BY ALL

結果が異なります。

CCATEGOLY_COUNTCATEGOLYNAME_COUNT
44

該当カラムにある値をカウントするだけで重複を省いてくれません。

つまり、このことからわかることは重複を省きたい場合はDISTINCTを強く意識しておく必要があるということです。

まとめ

DISTINCTとGROUP BYの違いについて解説いたしました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

著者:ブロガー2つ(につ)

■サイト設立目的
人海戦術の時代からテクノロジー活用による自動化促進の時代に変化。テクノロジー活用を促進するための情報共有やテクノロジー支援を行います。

目次