SQLでデータを操作していると、「重複データを排除したい」と思う場面に頻繁に出くわします。
例えば、ユニークな顧客リストや特定の項目の重複しないデータを抽出したい場合です。
そんな時に便利なのが DISTINCT 句。
本記事では、DISTINCTの基本から応用、注意点までを初心者向けに丁寧に解説します。さらに、よくあるミスやエラー例も取り上げ、使いこなせる知識を提供します!
なお、本記事ではSCOTTサンプルスキーマを使用した例で解説します。
SCOTTサンプルスキーマは以下を実行することでインポートおよび使用が可能です。
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/utlsampl.sql
$ sqlplus scott/tiger
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. DISTINCTとは何か?
DISTINCT句は、SQLのSELECT文で指定した列の重複を排除し、ユニークなデータだけを抽出するためのSQL句です。
サンプルデータ:EMPテーブル
この中から、ユニークな部門番号だけを取得するには、以下のクエリを使用します。
SELECT DISTINCT DEPTNO FROM EMP;
実行結果
SQL> SELECT DEPTNO FROM EMP;
DEPTNO
----------
20
30
30
20
30
30
10
20
10
30
20
30
20
10
14 rows selected.
SQL> SELECT DISTINCT DEPTNO FROM EMP;
DEPTNO
----------
30
10
20
結果として、部門番号「10」「20」「30」のみが表示されました。
2. 基本構文と使い方
DISTINCTを使う基本構文は以下の通りです。
SELECT DISTINCT 列名 FROM テーブル名;
2.1 単一列への適用
次のクエリは、JOB列のユニークな職種を取得します。
SELECT DISTINCT JOB FROM EMP;
実行結果
SQL> SELECT JOB FROM EMP;
JOB
---------
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
14 rows selected.
SQL> SELECT DISTINCT JOB FROM EMP;
JOB
---------
CLERK
SALESMAN
ANALYST
MANAGER
PRESIDENT
このように、指定した列のユニークなデータだけを簡単に取得できます。
2.2 複数列への適用
DISTINCTは、複数列の組み合わせにも使用できます。
以下のクエリは、JOBとDEPTNOのユニークな組み合わせを取得します。
SELECT DISTINCT JOB, DEPTNO FROM EMP;
実行結果
SQL> SELECT JOB, DEPTNO FROM EMP;
JOB DEPTNO
--------- ----------
CLERK 20
SALESMAN 30
SALESMAN 30
MANAGER 20
SALESMAN 30
MANAGER 30
MANAGER 10
ANALYST 20
PRESIDENT 10
SALESMAN 30
CLERK 20
CLERK 30
ANALYST 20
CLERK 10
14 rows selected.
SQL> SELECT DISTINCT JOB, DEPTNO FROM EMP;
JOB DEPTNO
--------- ----------
CLERK 20
MANAGER 20
MANAGER 30
MANAGER 10
SALESMAN 30
PRESIDENT 10
ANALYST 20
CLERK 30
CLERK 10
9 rows selected.
DISTINCTは指定したすべての列を基に、重複を排除します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
2.3 DISTINCTとCOUNTの組み合わせ
DISTINCTをCOUNT関数と組み合わせることで、ユニークな値の個数を取得できます。
SELECT COUNT(DISTINCT DEPTNO) AS UNIQUE_DEPT_COUNT FROM EMP;
実行結果
SQL> SELECT COUNT(DEPTNO) FROM EMP;
COUNT(DEPTNO)
-------------
14
SQL> SELECT COUNT(DISTINCT DEPTNO) AS UNIQUE_DEPT_COUNT FROM EMP;
UNIQUE_DEPT_COUNT
-----------------
3
部門番号のユニークな値が3つ存在することがわかります。
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;
この場合、JOBとDEPTNOの組み合わせがユニークなデータだけを取得します。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句は、データの重複を排除し、ユニークなデータを取得するための強力なツールです。以下のポイントを押さえれば、さらに効果的に活用できます。
- 必要な列だけを指定して使用する。
- パフォーマンスに配慮して、WHERE句やインデックスを適切に活用する。
- NULL値や複数列への適用についての特性を理解する。
DISTINCTを正しく活用し、効率的なデータ抽出を実現しましょう!
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント