SQL文で検索した結果に対して重複したレコードを取り除く(または、まとめる)場合、DISTINCTかGROUP BYを使うと思います。
SQLに慣れてないと、どちらも同じような機能だと勘違いしますが、一般的には単純に重複行を削除する場合はDISTINCT、レコードを集計する目的の場合はGROUP BYを使用します。
※書き方次第では結果になります
そこで今回は、DISTINCTとGROUP BYの違いと、適切な使い方やサンプルコードをご紹介します!
DISTINCTとGROUP BYの違い
DISTINCTは重複行を取り除くために使用されますが、GROUP BYは特定のカラムまたはカラムの組み合わせに基づいて行をグループ化し、グループごとの集計を行うために使用されます。
つまり、DISTINCTは重複行を単純に削除するために使用されますが、GROUP BYはグループごとの集計を行うために使用されます。どちらが最適かは使用目的によって異なります。
DISTINCTで重複行を削除する場合
DISTINCTは、テーブル内の重複行を取り除き、ユニークな行のみを取得する必要がある場合に使用されます。例えば、特定のカラムに対して重複する値がある場合、DISTINCTを使用することで重複行を削除してユニークな値のみを表示することができます。
GROUP BYでグループごとの集計をする場合
GROUP BYは、特定のカラムまたはカラムの組み合わせに基づいて行をグループ化し、グループごとの集計を行う場合に使用されます。
例えば、顧客ごとの売上額の合計を算出する場合、顧客名のカラムに対してGROUP BYを使用することでグループごとに売上額を集計することができます。
また、複数のカラムを組み合わせてグループ化することもできます。
例えば、都市名と国名に基づいてグループ化することもできます。
・DISTINCTは重複行を「削除」
・GROUP BYは重複行を「グループ化」
つまり、消すかまとめるかの違いですね!
DISTINCTとGROUP BYの書き方
まずは、DISTINCTとGROUP BYを使った、基本的なSQLのサンプルコードをご紹介します。
DISTINCTの書き方
以下がDISTINCTを使ったSQLのサンプルコードです
1 2 |
SELECT DISTINCT column1, column2, … FROM table_name; |
このSQLは、テーブル内の重複行を取り除き、column1、column2、…といった特定のカラムのユニークな値のみを表示します。
GROUP BYの書き方
以下がGROUP BYを使ったSQLのサンプルコードです:
1 |
SELECT column1, SUM(column2)<br>FROM table_name<br>GROUP BY column1; |
このSQLは、table_nameテーブル内のcolumn1カラムに基づいて行をグループ化し、column2カラムの合計値を算出します。
つまり、column1カラムに対してグループごとにcolumn2カラムの合計値を表示することができます。
DISTINCTとGROUP BYの結果は必ず同じではない
DISTINCTは、テーブル内の重複行を取り除き、ユニークな行のみを返すことを目的としています。
一方、GROUP BYは、特定のカラムまたはカラムの組み合わせに基づいて行をグループ化し、グループごとの集計を行うことを目的としていますので、グループ化により重複行が取り除かれることはありますが、グループごとの集計の目的から考えると、単純な重複行の削除ではなく、グループごとの統計情報を算出することが目的です。
したがって、DISTINCTとGROUP BYは異なる目的を持っているため、異なる結果を返すことがあります。
DISTINCTとGROUP BYで同じ結果を返す方法
SQLで重複レコードを除去するには、次の2つの方法があります。
DISTINCTで重複行を除去(削除)
単純にDISTINCTをSELECTの後ろに付けるだけで削除してくれます。
1 2 |
SELECT DISTINCT column1, column2, ... FROM table_name; |
GROUP BYで重複行を除去(グループ化)
GROUP BYはユニーク(グループ化)にしたいカラム全てを記述する必要があります。
1 2 3 |
SELECT column1, column2, ... FROM table_name GROUP BY column1, column2, ...; |
これらの2つの方法は、テーブル内の重複行を取り除くために使用することができます。
また、GROUP BYを使用すると、グループごとの集計も行うことができます。
コメント