SQLで普段からよく使う構文に「distinct」があります。distinctは重複したカラムを1つにして抽出する際に使う構文です。
例えば、どのユーザーが何の商品を買ったかが管理されているテーブルの場合、売れた商品の一覧や、購入したユーザーだけを抽出するなどそのような際に使うことができます。
似たような構文に「group by」がありますが、distinctとgroup byの主な違いとしては、「distinctが実行した結果のテーブルから、重複している行を削除した結果を出すのに対し、group byは実行した結果をグループ化して更に集計する際に用いる。」といった差があります。
サンプルデータからdistinctの考え方を掴む
下記のように商品とユーザー別に管理されているテーブルをイメージしてください。
商品名 | ユーザー名 | 個数 | 商品価格 | 購入日時 |
---|---|---|---|---|
ノートPC | 田中太郎 | 1 | 120,000 | 2023-10-01 10:15:00 |
スマートフォン | 鈴木花子 | 2 | 80,000 | 2023-10-02 14:30:00 |
タブレット | 田中太郎 | 1 | 50,000 | 2023-10-03 09:45:00 |
スマートフォン | 山田次郎 | 1 | 80,000 | 2023-10-04 16:00:00 |
ノートPC | 佐藤健 | 1 | 120,000 | 2023-10-05 11:20:00 |
ノートPC | 田中太郎 | 2 | 120,000 | 2023-10-06 13:50:00 |
スマートフォン | 鈴木花子 | 1 | 80,000 | 2023-10-07 08:30:00 |
タブレット | 佐藤健 | 3 | 50,000 | 2023-10-08 15:45:00 |
ノートPC | 山田次郎 | 1 | 120,000 | 2023-10-09 17:10:00 |
スマートフォン | 田中太郎 | 1 | 80,000 | 2023-10-10 19:00:00 |
このようなテーブルがあった際、例えば購入されたユニークな商品を知りたい場合やユニークな購入者数を抽出したいなど思うことがあると思います。
そういう時に下記のようにdistinctを加えることで重複を除いてカウントできます。
-- ユニークな商品名の数を取得 SELECT COUNT(DISTINCT 商品名) AS ユニーク商品数 FROM テーブル名; -- ユニークなユーザー名の数を取得 SELECT COUNT(DISTINCT ユーザー名) AS ユニークユーザー数 FROM テーブル名;
group byを使う場合
distinctは、あくまで単一のデータの重複を除外するのみになります。それぞれのデータに対して、何件購入されたか?のような集計をする場合はgroup byを使います。
SELECT 商品名, COUNT(*) AS 購入件数 FROM テーブル名 GROUP BY 商品名;
以上簡単にdistinctの紹介をしてみました。普段からよく使う構文なので是非うまく使ってみてくださいね。