DISTINCTで重複排除
DISTINCTで重複排除 とは
DISTINCTを使って、SQLで重複データを取り除く方法を実践的に学習します。本レッスンでは、DISTINCTで重複排除 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
データベースの結果セットには、しばしば「同じ値」が重複して含まれます。たとえば顧客の購入履歴テーブルから「商品を買ったことのある顧客 ID 一覧」を取り出すと、同じ顧客が何度も登場します。社内で「アクセスがあったブラウザ一覧」「契約のあった会社の業種一覧」「対応中のサポート担当者の名前」など、ユニーク値だけを取り出したい場面はとても多いです。SQL では DISTINCT キーワードを使うとこの 重複排除 が 1 行で書けます。
このレッスンでは DISTINCT の基本構文、複数列指定、COUNT(DISTINCT 列) 形式の集計、GROUP BY との違いを学びます。DISTINCT は使いどころを誤ると重い処理になるので、合わせて性能観点も押さえます。
基本構文
もっとも基本の使い方は SELECT DISTINCT 列名 です。
SQL クエリ
SELECT DISTINCT category
FROM products;これで products テーブルにあるカテゴリの一覧 (重複なし) が取れます。DISTINCT は SELECT 句の直後に書き、その後ろに並べた列すべての組み合わせで重複排除が行われます。
複数列を指定したとき
2 列以上を DISTINCT で指定したときは「列の組み合わせ」がユニークになります。
SQL クエリ
SELECT DISTINCT category, brand
FROM products;上記は (category, brand) のペアを一意化します。category だけがユニークになるわけではない点に注意してください。
処理イメージ
DISTINCT は次の流れで評価されます。
DISTINCT は SELECT で選んだ列の組み合わせ単位で重複排除されるので、不要な列を入れると重複が「無くなって」しまい意図と違うことがあります。最初は「ユニークにしたい列だけを SELECT する」のが安全です。
代表例 1 カテゴリ一覧
SQL クエリ
SELECT DISTINCT category
FROM products
ORDER BY category;ORDER BY と組み合わせて、ユーザにドロップダウン候補を出すような UI 用クエリでよく使います。
代表例 2 ユニークユーザ数を数える
DISTINCT は集計関数の中にも書けます。
SQL クエリ
SELECT
COUNT(*) AS log_count,
COUNT(DISTINCT user_id) AS uu
FROM access_logs;COUNT(DISTINCT user_id) は アクセスログ から「ユニークユーザ数 (UU)」を出す定番パターンです。SUM(DISTINCT) や AVG(DISTINCT) も書けますが、業務でよく使うのはほぼ COUNT(DISTINCT) だけだと覚えておけば十分です。
ユニークユーザ数を出すなら
COUNT(DISTINCT user_id)を使う。COUNT(*)は重複を含む延べ件数なので別の指標です。
DISTINCT と GROUP BY の違い
似た動きをするのが GROUP BY で、シンプルに重複を排除するだけなら DISTINCT のほうが読みやすいことが多いです。一方で「同時に集計値も計算したい」なら GROUP BY が必要です。
SQL クエリ
-- 似た結果になる
SELECT DISTINCT category FROM products;
SELECT category FROM products GROUP BY category;用途で使い分けます。読み手の意図を伝える観点では「ただ一覧を出したい時は DISTINCT」「集計したい時は GROUP BY」を基本とするのが分かりやすいです。
パフォーマンスと注意点
DISTINCT は内部的にソートやハッシュで重複を確認するため、データ量が膨大だと重くなります。インデックスが効かないシナリオでは特に遅くなりやすいので、必要な列だけに絞り、可能なら WHERE で先に行数を絞ってから使うのが基本です。
また DISTINCT は NULL を「1 つの値」として扱います。NULL を含む列を DISTINCT すると、NULL が 1 行だけ残ります (複数の NULL は 1 つに統合)。普通の比較 (= NULL) では NULL 同士は一致しませんが、DISTINCT の重複判定では一致扱いされる、という独特の挙動です。
まとめ
DISTINCTは SELECT 句の直後に書き、列の組み合わせで重複排除- 複数列指定はその組み合わせで一意化される
COUNT(DISTINCT 列)でユニーク件数 (UU 等) を集計- ただ一覧を出したいなら DISTINCT、集計したいなら GROUP BY
- DISTINCT は重い処理になりがちなので、WHERE で先に絞る
- DISTINCT は NULL を 1 つの値として扱う
- UI のドロップダウン候補や、分析画面の母集団指標を作るときによく使う
- 重複の有無を調べたいだけなら、件数を
COUNT(*)とCOUNT(DISTINCT 列)で比較すると一目で分かる
次のレッスン
次は 文字列関数 です。SQLで文字列を操作するための便利な関数を、サンプルコードを動かしながら学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- DISTINCT の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. DISTINCT とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
テーブル構造
schema.sql
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT NOT NULL,
product VARCHAR(50) NOT NULL,
amount INT NOT NULL
);
INSERT INTO orders (id, user_id, product, amount) VALUES
(1, 101, 'ノートPC', 128000),
(2, 102, 'マウス', 2980),
(3, 101, 'キーボード', 6800),
(4, 103, 'マウス', 2980),
(5, 101, '小説A', 1800),
(6, 104, '小説B', 2200),
(7, 102, 'コーヒー豆', 1500),
(8, 103, '紅茶葉', 1200);期待される出力
| user_unique_count |
|---|
| 4 |