SQLでデータを操作していると、「重複データを排除したい」と思う場面に頻繁に出くわします。
例えば、ユニークな顧客リストや特定の項目の重複しないデータを抽出したい場合です。
そんな時に便利なのが DISTINCT 句。
本記事では、DISTINCTの基本から応用、注意点までを初心者向けに丁寧に解説します。さらに、よくあるミスやエラー例も取り上げ、使いこなせる知識を提供します!
1. DISTINCTとは何か?
DISTINCT句は、SQLのSELECT文で指定した列の重複を排除し、ユニークなデータだけを抽出するためのSQL句です。
例えば、次のようなデータセットがあるとします。
サンプルデータ:EMPテーブル
EMPNO | ENAME | JOB | SALARY | DEPTNO |
---|---|---|---|---|
7369 | SMITH | CLERK | 800 | 20 |
7499 | ALLEN | SALESMAN | 1600 | 30 |
7521 | WARD | SALESMAN | 1250 | 30 |
7566 | JONES | MANAGER | 2975 | 20 |
7698 | BLAKE | MANAGER | 2850 | 30 |
この中から、ユニークな部門番号だけを取得するには、以下のクエリを使用します。
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は、複数列の組み合わせにも使用できます。
以下のクエリは、JOB
とDEPTNO
のユニークな組み合わせを取得します。
SELECT DISTINCT JOB, DEPTNO
FROM EMP;
実行結果
JOB | DEPTNO |
---|---|
CLERK | 20 |
SALESMAN | 30 |
MANAGER | 20 |
MANAGER | 30 |
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;
この場合、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
コメント