DISTINCTをマスターしよう!重複データの排除と応用方法

Oracle Master Silver

SQLでデータを操作していると、「重複データを排除したい」と思う場面に頻繁に出くわします。
例えば、ユニークな顧客リストや特定の項目の重複しないデータを抽出したい場合です。

そんな時に便利なのが DISTINCT 句。
本記事では、DISTINCTの基本から応用、注意点までを初心者向けに丁寧に解説します。さらに、よくあるミスやエラー例も取り上げ、使いこなせる知識を提供します!


1. DISTINCTとは何か?

DISTINCT句は、SQLのSELECT文で指定した列の重複を排除し、ユニークなデータだけを抽出するためのSQL句です。
例えば、次のようなデータセットがあるとします。

サンプルデータ:EMPテーブル

EMPNOENAMEJOBSALARYDEPTNO
7369SMITHCLERK80020
7499ALLENSALESMAN160030
7521WARDSALESMAN125030
7566JONESMANAGER297520
7698BLAKEMANAGER285030

この中から、ユニークな部門番号だけを取得するには、以下のクエリを使用します。

SELECT DISTINCT DEPTNO
FROM EMP;

実行結果

DEPTNO
20
30

結果として、部門番号「20」と「30」のみが表示されました。


2. 基本構文と使い方

DISTINCTを使う基本構文は以下の通りです。

SELECT DISTINCT 列名
FROM テーブル名;

2.1 単一列への適用

次のクエリは、JOB列のユニークな職種を取得します。

SELECT DISTINCT JOB
FROM EMP;

実行結果

JOB
CLERK
SALESMAN
MANAGER

このように、指定した列のユニークなデータだけを簡単に取得できます。


2.2 複数列への適用

DISTINCTは、複数列の組み合わせにも使用できます。
以下のクエリは、JOBDEPTNOのユニークな組み合わせを取得します。

SELECT DISTINCT JOB, DEPTNO
FROM EMP;

実行結果

JOBDEPTNO
CLERK20
SALESMAN30
MANAGER20
MANAGER30

DISTINCTは指定したすべての列を基に、重複を排除します。


2.3 DISTINCTとCOUNTの組み合わせ

DISTINCTをCOUNT関数と組み合わせることで、ユニークな値の個数を取得できます。

SELECT COUNT(DISTINCT DEPTNO) AS UNIQUE_DEPT_COUNT
FROM EMP;

実行結果

UNIQUE_DEPT_COUNT
2

部門番号のユニークな値が2つ存在することがわかります。


3. 応用編

3.1 NULL値を含む場合

DISTINCTは、NULLを1つのユニークな値として扱います。以下のクエリを実行して確認します。

SELECT DISTINCT DEPTNO
FROM EMP
WHERE DEPTNO IS NULL;

結果には、NULLが一度だけ表示されます。


3.2 SELECT DISTINCT *

SELECT DISTINCT * を使用すると、テーブル全体のユニークな行を取得します。
ただし、列数が多い場合やデータ量が大きい場合、パフォーマンスに影響を与えることがあります。


4. 注意点とよくある誤解

4.1 DISTINCTはすべての列に適用される

複数列にDISTINCTを適用した場合、すべての列を組み合わせたユニークなデータが取得されます。
次のクエリを見てみましょう。

SELECT DISTINCT JOB, DEPTNO
FROM EMP;

この場合、JOBDEPTNOの組み合わせがユニークなデータだけを取得します。JOB単独でユニークなデータを取得したい場合は、列を限定する必要があります。


4.2 パフォーマンスへの影響

DISTINCTは内部的にソート処理やハッシュ処理を行うため、データ量が多い場合はパフォーマンスに影響を与える可能性があります。

改善案

  • 必要な列を絞り込んでクエリを記述する。
  • WHERE句を使用してデータ量を減らす。

5. よくあるエラー例

5.1 列を間違えて指定する

SELECT DISTINCT NON_EXISTING_COLUMN
FROM EMP;

このクエリは存在しない列を指定しているため、エラーになります。列名を正確に確認しましょう。


5.2 不要なDISTINCTの使用

SELECT DISTINCT ENAME, ENAME
FROM EMP;

同じ列を複数回指定すると冗長になるため、列の選定に注意してください。


6. まとめ

DISTINCT句は、データの重複を排除し、ユニークなデータを取得するための強力なツールです。以下のポイントを押さえれば、さらに効果的に活用できます。

  1. 必要な列だけを指定して使用する。
  2. パフォーマンスに配慮して、WHERE句やインデックスを適切に活用する。
  3. NULL値や複数列への適用についての特性を理解する。

DISTINCTを正しく活用し、効率的なデータ抽出を実現しましょう!

[参考]
Oracle Database SQL言語リファレンス 19c

コメント

タイトルとURLをコピーしました