0Pricing
SQL Academy · レッスン

SELECT DISTINCTの基本

重複しない行だけを返します。

「SELECT DISTINCTの基本」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

重複が発生する理由

テーブルには、同じ値が繰り返し含まれていることがよくあります。customers テーブルには、何千行にもわたって同じ city が記録されている場合があります。重複のない値の集合だけが必要な場合でも、通常の SELECT は重複を含むすべての行を返します。

SELECT DISTINCT は同一の行を1行にまとめます。このレッスンでは、一意な結果だけを返す基本的な方法を学びます。

SELECT city FROM customers;
-- Returns one row per customer, with many repeated cities

DISTINCTキーワード

DISTINCT は SELECT の直後に置きます。結果セットから重複行を取り除き、選択した列の一意な組み合わせごとに1つだけ残します。

SELECT DISTINCT city
FROM customers;
-- One row per unique city

DISTINCTは行全体に適用される

よくある誤解は、DISTINCT が1つの列だけに適用されるというものです。実際には、選択した行全体に適用されます。指定したすべての列が、2つの行を重複とみなすかどうかの判定に関わります。

以下では、選択されている列が city だけなので、city の値によってのみ行が重複除去されます。

SELECT DISTINCT country
FROM customers;
-- Unique countries across all customers

サンプルデータ

小さな orders テーブルを考えてみましょう。繰り返し登場する status と country の値に注目してください。このレッスンでは、全体を通してこの形式を使用します。

  • id=1, status='paid', country='US'
  • id=2, status='paid', country='US'
  • id=3, status='shipped', country='DE'
  • id=4, status='paid', country='DE'
CREATE TABLE orders (
  id         int PRIMARY KEY,
  status     text,
  country    text,
  amount     numeric(10,2)
);

1列でのDISTINCT

サンプルデータから DISTINCT status を選択すると、一意なステータス値である paid と shipped が返されます。4行が2行にまとまります。

SELECT DISTINCT status
FROM orders;
-- paid
-- shipped

NULLは1つの値として扱われる

NULL は通常、何とも等しくありません(それ自体とも等しくありません)。それでも DISTINCT は、すべての NULL を1つのグループとして扱います。ある列に NULL の行が多数あっても、重複のない結果には NULL が1つだけ含まれます。

SELECT DISTINCT shipped_at
FROM orders;
-- All NULL shipped_at rows collapse into a single NULL row

DISTINCTとORDER BY

通常は、一意な値を並べ替えて表示したいでしょう。DISTINCT でまず一意な集合を作成し、その後 ORDER BY で並べ替えます。DISTINCT と併用する場合、ORDER BY に指定する列は SELECT リストにも含める必要があります。

SELECT DISTINCT country
FROM orders
ORDER BY country;
-- DE
-- US

DISTINCTとGROUP BY

SELECT DISTINCT col と SELECT col GROUP BY col は、同じ一意な行を生成します。一意な値だけが必要な場合は DISTINCT を使い、グループごとの COUNT などの集計も必要な場合は GROUP BY を使います。

-- These two return the same set of countries:
SELECT DISTINCT country FROM orders;

SELECT country FROM orders
GROUP BY country;

DISTINCTにはコストがかかる

重複の除去にコストがかからないわけではありません。データベースは一意な行を見つけるために、候補となるすべての行を並べ替えるかハッシュ化する必要があります。大きなテーブルではCPUとメモリの負荷が増えるため、本当に一意性が必要な場合だけ DISTINCT を使用してください。

-- Avoid blind DISTINCT on every query.
-- If the column is already unique (e.g. a PRIMARY KEY),
-- DISTINCT does nothing useful but still costs work:
SELECT DISTINCT id FROM orders;  -- id is already unique

式にDISTINCTを適用する

DISTINCT は、単純な列だけでなく計算された式にも適用できます。データベースはすべての行について式を評価してから、結果の重複を除去します。

SELECT DISTINCT upper(country) AS country_code
FROM orders
ORDER BY country_code;
-- DE
-- US

参照リストを作成する

DISTINCT の実用的な用途の1つは、アプリケーションのドロップダウンやフィルターリストに値を設定することです。一意なステータスを取得すれば、現在データに存在するすべての選択肢をユーザーに表示できます。

SELECT DISTINCT status
FROM orders
ORDER BY status;
-- paid
-- shipped

確認問題

DISTINCT キーワードはどこに置き、何を重複除去しますか。

まとめ

SELECT DISTINCT の基本を学びました。

  • 結果セットから重複行を取り除きます。
  • 1つの列ではなく、選択した行全体に適用されます。
  • すべての NULL が1つの値にまとめられます。
  • ORDER BY は重複除去の後に実行され、その列は選択されている必要があります。
  • 追加の処理コストがかかるため、必要な場合だけ使用してください。

次は、複数列に対する DISTINCT の使い方です。

SELECT DISTINCT status
FROM orders
ORDER BY status;

よくある質問

「SELECT DISTINCTの基本」レッスンは無料ですか?

はい。「SELECT DISTINCTの基本」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「SELECT DISTINCTの基本」で何を学びますか?

重複しない行だけを返します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「SELECT DISTINCTの基本」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. SELECT DISTINCTの基本
  2. 複数列に対するDISTINCT
  3. PostgreSQLのDISTINCT ON
  4. 一意な値を数える
← SQL Academyに戻る