🗄️SQL

SQLで重複行を除いて取得する方法(DISTINCT)

SQLで「同じ値が何度も出てくるのを1つにまとめたい」ときはDISTINCTを使います。重複を除いた結果を取得できます。基本の書き方と、複数列での使い方をコピペで使える形で紹介します。

-- 重複を除いて取得
SELECT DISTINCT category FROM products;

-- 複数列の組み合わせで重複判定
SELECT DISTINCT category, maker FROM products;
書き方意味
DISTINCT 列その列の重複を除く
DISTINCT 列A, 列B組み合わせで重複判定

基本の書き方

SELECTの直後にDISTINCTを置きます。

1列の重複除去
SELECT DISTINCT 列名 とすると、その列の重複した値が1つにまとめられます。一覧の取得などに便利です。
複数列の場合
複数の列を指定すると、その「組み合わせ」が同じ行が重複として扱われます。どれか1つでも違えば別の行になります。
コツ:DISTINCTはSELECTの直後に1つだけ書きます。指定した列すべての組み合わせで重複判定されるため、「どの列で重複を見たいか」を意識して列を選びましょう。

GROUP BYとの違い

似ていますが用途が異なります。

  • DISTINCT…単純に重複を除いて一覧を取得したいとき。
  • GROUP BY…グループごとに集計(件数・合計など)したいとき。
  • 使い分け…集計が不要ならDISTINCTがシンプル。
注意:DISTINCTは指定した全列の組み合わせで重複を見ます。「1列だけ重複を除きたいのに、別の列も書いたら重複が消えない」というのはよくある勘違い。重複判定に使う列だけを指定しましょう。

あわせて読みたい:SQLでグループごとの件数を数える方法(GROUP BY)CSSで影をつける方法(box-shadow)の基本SQLの記事一覧

まとめ

SQLの重複除去はSELECT DISTINCT 列名が基本。複数列を指定するとその組み合わせで重複判定されます。DISTINCTは一覧取得向き、集計したいならGROUP BYを使い分けましょう。指定した全列の組み合わせで重複を見る点に注意が必要です。

よくある質問

SQLで重複行を除くには?
SELECT DISTINCT 列名 とします。例えば SELECT DISTINCT category FROM products; で、categoryの重複した値を1つにまとめて取得できます。
複数の列で重複判定するには?
SELECT DISTINCT 列A, 列B のように複数列を指定します。その列の組み合わせが同じ行が重複として扱われ、どれか1つでも違えば別の行になります。
DISTINCTとGROUP BYの違いは?
DISTINCTは単純に重複を除いて一覧を取得するとき、GROUP BYはグループごとに件数や合計を集計するときに使います。集計が不要ならDISTINCTがシンプルです。
DISTINCTで重複が消えないのはなぜ?
指定した全列の組み合わせで重複を判定するためです。1列だけ重複を除きたいのに別の列も書くと、組み合わせが異なり重複が消えません。必要な列だけ指定しましょう。