複数列に対するDISTINCT
列の組み合わせ単位で一意性を扱います。
「複数列に対するDISTINCT」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
複数列を使う理由
SELECT DISTINCT が重複行を取り除くことは、すでに学びました。しかし、クエリが複数の列を返す場合、「重複」とは何を意味するのでしょうか。
ある行は、選択したすべての列が別の行と同じ値である場合にのみ、重複とみなされます。1つでも異なる列があれば、両方の行が残ります。
サンプルテーブル:orders
実験用に小さな orders テーブルを作成しましょう。このテーブルには、どの顧客がどのカテゴリの商品をどの国で購入したかが記録されています。
CREATE TABLE orders (
id INTEGER,
customer VARCHAR(50),
category VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Electronics', 'US'),
(2, 'Alice', 'Books', 'US'),
(3, 'Bob', 'Electronics', 'UK'),
(4, 'Alice', 'Electronics', 'US'),
(5, 'Bob', 'Electronics', 'UK'),
(6, 'Carol', 'Clothing', 'CA');1列にDISTINCTを適用する
簡単に復習しましょう。1列にDISTINCTを使用すると、その列の一意な値だけがそれぞれ返されます。
ここでは、一意な顧客名をすべて取得します。注文は6件ありますが、結果はわずか3行です。
SELECT DISTINCT customer
FROM orders;2列にDISTINCTを適用する
次に2列目を追加します。キーワードDISTINCTはこれまでどおりSELECTの直後に1回だけ記述します。データベースは、一意な(customer, category)ペアごとに1行として扱います。
Aliceは2回登場します。Electronicsに1回、Booksに1回です。これは異なる2つの組み合わせだからです。
SELECT DISTINCT customer, category
FROM orders;一意性の確認方法
データベースは、行全体のスナップショットを比較します。DISTINCTで行を除去するには、SELECTリスト内のすべての列がすでに確認された行と完全に一致している必要があります。
ordersテーブルでは、3行目と5行目がどちらも (Bob, Electronics, UK) です。3列すべてが完全に一致するため、どちらか一方が除去されます。
SELECT DISTINCT customer, category, country
FROM orders;
-- Row (Bob, Electronics, UK) appears only once
-- even though it occurs on rows 3 and 5部分一致では除去されない
Aliceには category = Electronics の行が2つありますが、どちらも country = US です。3列すべてを選択すると、元の2行は同一なので、1行だけが残ります。
選択する列を変えると、一意性の判定も変わります。
-- Select only customer + country
-- (Alice, US) appears twice in the table but DISTINCT keeps it once
SELECT DISTINCT customer, country
FROM orders;
-- Now add category back — uniqueness recalculated
SELECT DISTINCT customer, category, country
FROM orders;実践例:一意な組み合わせ
よくあるパターンとして、2つの属性の一意な組み合わせをすべて見つける方法があります。たとえば、各販売が何回行われたかに関係なく、どの商品カテゴリがどの国で販売されているかを調べる場合です。
SELECT DISTINCT category, country
FROM orders
ORDER BY category, country;DISTINCT と WHERE の組み合わせ
まず WHERE で行を絞り込み、その後 DISTINCT で絞り込み結果から重複を削除できます。この2つの句は独立して機能します。WHERE はデータを絞り込み、DISTINCT は重複を排除します。
SELECT DISTINCT customer, category
FROM orders
WHERE country = 'US';DISTINCT と GROUP BY の違い
一意な組み合わせを取得する同等の方法として、GROUP BY も使用できます。単純に重複を排除する場合、どちらの方法でも同じ結果になります。違いが重要になるのは、集約結果が必要な場合です。GROUP BY では COUNT(*), SUM() などを追加できますが、DISTINCT では追加できません。
-- Using DISTINCT
SELECT DISTINCT customer, category
FROM orders;
-- Equivalent using GROUP BY
SELECT customer, category
FROM orders
GROUP BY customer, category;一意な組み合わせの件数を数える
複数列の DISTINCT をサブクエリの中に記述して囲むと、存在する一意な組み合わせの数を数えることができます。これはデータの多様性を測定する便利な方法です。
SELECT COUNT(*) AS unique_customer_category_pairs
FROM (
SELECT DISTINCT customer, category
FROM orders
) AS deduped;よくある間違い:DISTINCT はすべての列に適用される
DISTINCT は最初に記述した列だけに適用される、という誤解がよくあります。そうではありません。 DISTINCT は、選択したすべての列で構成される行全体を常に比較します。
一部の列だけに DISTINCT を適用し、他の列では重複を残すことはできません。その場合は、ROW_NUMBER() のようなウィンドウ関数が必要です。
-- This does NOT give distinct customers with any category
-- It gives distinct (customer, category) pairs
SELECT DISTINCT customer, category
FROM orders;
-- If you want one row per customer (any category), use:
SELECT customer, MIN(category) AS sample_category
FROM orders
GROUP BY customer;理解度チェック
複数列に対する DISTINCT の理解度を確認しましょう。
レッスンのまとめ
よくできました。複数列で DISTINCT を使用する方法について、次のことを学びました。
- DISTINCT は行全体に適用されるため、選択したすべての列がまとめて確認されます。
- すでに確認された行とすべての列が完全に一致する場合にのみ、その行は除外されます。
- SELECT リストに列を追加したり削除したりすると、どの行が重複と見なされるかが変わります。
- DISTINCT は WHERE や ORDER BY と自由に組み合わせることができます。
- GROUP BY も同等の方法であり、集約結果も必要な場合に使用します。
複数列の DISTINCT を使いこなすと、あらゆるデータセットで一意な組み合わせを効率的に調べられるようになります。
よくある質問
「複数列に対するDISTINCT」レッスンは無料ですか?
はい。「複数列に対するDISTINCT」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「複数列に対するDISTINCT」で何を学びますか?
列の組み合わせ単位で一意性を扱います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「複数列に対するDISTINCT」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SELECT DISTINCTの基本
- 複数列に対するDISTINCT
- PostgreSQLのDISTINCT ON
- 一意な値を数える