SQLのDISTINCT句とは?意味をわかりやすく簡単に解説
スポンサーリンク
目次
- DISTINCT句とは
- DISTINCT句を使用する状況
- 重複データを排除し、ユニークな値のみを取得したい場合
- 集約関数と組み合わせて、ユニークな値の数や統計情報を求める場合
- サブクエリ内でDISTINCT句を使用し、絞り込み条件を指定する場合
- DISTINCT句の注意点
- DISTINCT句はクエリのパフォーマンスに影響を与える可能性がある
- DISTINCT句は指定したカラムの組み合わせが完全に一致する行のみを除外する
- DISTINCT句はNULL値を含む行も排除する
- DISTINCT句の使用例
- 単一のカラムに対してDISTINCT句を使用する例
- 複数のカラムに対してDISTINCT句を使用する例
- 集約関数とDISTINCT句を組み合わせて使用する例
DISTINCT句とは
DISTINCT句はSQLクエリにおいて重複するデータを排除するために使用される句です。SELECT文で取得するカラムに対してDISTINCT句を指定することで、重複する行を除外した結果を取得できます。
例えば、「SELECT DISTINCT 都道府県 FROM 住所テーブル;」というクエリを実行すると、住所テーブルに登録されている都道府県の一覧を重複なしで取得することができます。DISTINCT句を使用しない場合は同じ都道府県が複数回出現する可能性があります。
DISTINCT句は指定したカラムの組み合わせが完全に一致する行のみを除外します。例えば、「SELECT DISTINCT 都道府県, 市区町村 FROM 住所テーブル;」とすると、都道府県と市区町村の組み合わせが同じ行が排除されます。
DISTINCT句を使用する際はクエリのパフォーマンスに影響を与える可能性があることに注意が必要です。DISTINCT句は重複排除のために追加の処理を行うため、大量のデータを扱う場合はクエリの実行時間が長くなる可能性があります。
また、DISTINCT句は集約関数(COUNT、SUM、AVG など)と組み合わせて使用することもできます。例えば、「SELECT COUNT(DISTINCT 都道府県) FROM 住所テーブル;」とすることで、住所テーブルに登録されている都道府県の種類数を取得できます。
DISTINCT句を使用する状況
DISTINCT句を使用する状況に関して、以下3つを簡単に解説していきます。
- 重複データを排除し、ユニークな値のみを取得したい場合
- 集約関数と組み合わせて、ユニークな値の数や統計情報を求める場合
- サブクエリ内でDISTINCT句を使用し、絞り込み条件を指定する場合
重複データを排除し、ユニークな値のみを取得したい場合
DISTINCT句は重複するデータを排除し、ユニークな値のみを取得したい場合に使用します。例えば、社員テーブルから部署名の一覧を取得する際、同じ部署名が複数存在する場合にDISTINCT句を使用することで、重複を排除した部署名の一覧を取得できます。
「SELECT DISTINCT 部署名 FROM 社員テーブル;」というクエリを実行すると、社員テーブルに存在する部署名をユニークな値で取得することができます。DISTINCT句を使用しない場合は同じ部署名が複数回出現することがあります。
SELECT DISTINCT department_name
FROM employees;
スポンサーリンク
集約関数と組み合わせて、ユニークな値の数や統計情報を求める場合
DISTINCT句は集約関数(COUNT、SUM、AVG など)と組み合わせて使用することで、ユニークな値の数や統計情報を求めることができます。例えば、「SELECT COUNT(DISTINCT 部署名) FROM 社員テーブル;」とすることで、社員テーブルに登録されている部署の種類数を取得できます。
また、「SELECT AVG(DISTINCT 年収) FROM 社員テーブル;」とすることで、社員テーブルに登録されている年収の平均値を、重複を排除した状態で計算することができます。DISTINCT句を使用しない場合は重複する年収も含めて平均値が算出されます。
SELECT COUNT(DISTINCT department_name) AS num_departments
FROM employees;
サブクエリ内でDISTINCT句を使用し、絞り込み条件を指定する場合
DISTINCT句はサブクエリ内で使用することで、メインクエリの絞り込み条件を指定する際に役立ちます。例えば、「SELECT * FROM 社員テーブル WHERE 部署名 IN (SELECT DISTINCT 部署名 FROM 部署テーブル WHERE 所在地 = '東京');」というクエリを実行すると、部署テーブルから所在地が東京の部署名をユニークな値で取得し、その部署に所属する社員情報を社員テーブルから取得することができます。
サブクエリ内でDISTINCT句を使用することで、重複を排除した条件指定が可能になります。DISTINCT句を使用しない場合はサブクエリの結果に重複が含まれ、予期しない結果になる可能性があります。
SELECT *
FROM employees
WHERE department_name IN (
SELECT DISTINCT department_name
FROM departments
WHERE location = 'Tokyo'
);
DISTINCT句の注意点
DISTINCT句の注意点に関して、以下3つを簡単に解説していきます。
- DISTINCT句はクエリのパフォーマンスに影響を与える可能性がある
- DISTINCT句は指定したカラムの組み合わせが完全に一致する行のみを除外する
- DISTINCT句はNULL値を含む行も排除する
DISTINCT句はクエリのパフォーマンスに影響を与える可能性がある
DISTINCT句を使用すると、クエリのパフォーマンスに影響を与える可能性があります。DISTINCT句は重複排除のために追加の処理を行うため、大量のデータを扱う場合はクエリの実行時間が長くなることがあります。
特に、DISTINCT句を使用するカラムにインデックスが設定されていない場合、全ての行をスキャンする必要があるため、パフォーマンスが低下する可能性が高くなります。DISTINCT句を使用する際はインデックスの設定状況を確認し、必要に応じてインデックスを追加することが重要です。
-- インデックスが設定されていない場合、パフォーマンスが低下する可能性がある
SELECT DISTINCT department_name
FROM employees;
スポンサーリンク
DISTINCT句は指定したカラムの組み合わせが完全に一致する行のみを除外する
DISTINCT句は指定したカラムの組み合わせが完全に一致する行のみを除外します。例えば、「SELECT DISTINCT 部署名, 役職 FROM 社員テーブル;」というクエリを実行すると、部署名と役職の組み合わせが同じ行が排除されます。
ただし、指定したカラムの一部が異なる場合は別の行として扱われます。例えば、「部署名=営業部、役職=主任」と「部署名=営業部、役職=係長」は部署名は同じでも役職が異なるため、別の行として扱われます。
SELECT DISTINCT department_name, position
FROM employees;
DISTINCT句はNULL値を含む行も排除する
DISTINCT句はNULL値を含む行も排除します。例えば、「SELECT DISTINCT 部署名 FROM 社員テーブル;」というクエリを実行すると、部署名がNULLの行も排除されます。
ただし、NULL値は特殊な値であり、NULL値同士は等しいとは見なされません。そのため、「SELECT DISTINCT 部署名, 役職 FROM 社員テーブル;」というクエリを実行した場合、部署名がNULLで役職が異なる行は別の行として扱われます。
SELECT DISTINCT department_name
FROM employees;
DISTINCT句の使用例
DISTINCT句の使用例に関して、以下3つを簡単に解説していきます。
- 単一のカラムに対してDISTINCT句を使用する例
- 複数のカラムに対してDISTINCT句を使用する例
- 集約関数とDISTINCT句を組み合わせて使用する例
単一のカラムに対してDISTINCT句を使用する例
単一のカラムに対してDISTINCT句を使用する例を示します。以下のクエリは社員テーブルから部署名の一覧を重複なしで取得するために、DISTINCT句を使用しています。
SELECT DISTINCT department_name
FROM employees;
このクエリを実行すると、社員テーブルに存在する部署名がユニークな値で取得されます。同じ部署名が複数存在する場合でも、重複は排除され、一意の部署名のみが結果として返されます。
複数のカラムに対してDISTINCT句を使用する例
複数のカラムに対してDISTINCT句を使用する例を示します。以下のクエリは社員テーブルから部署名と役職の組み合わせを重複なしで取得するために、DISTINCT句を使用しています。
SELECT DISTINCT department_name, position
FROM employees;
このクエリを実行すると、社員テーブルに存在する部署名と役職の組み合わせがユニークな値で取得されます。部署名と役職の両方が同じ行のみが排除され、一意の組み合わせが結果として返されます。
集約関数とDISTINCT句を組み合わせて使用する例
集約関数とDISTINCT句を組み合わせて使用する例を示します。以下のクエリは社員テーブルに登録されている部署の種類数を取得するために、COUNT関数とDISTINCT句を組み合わせて使用しています。
SELECT COUNT(DISTINCT department_name) AS num_departments
FROM employees;
このクエリを実行すると、社員テーブルに存在する部署名の種類数が取得されます。DISTINCT句により重複が排除され、COUNT関数によってユニークな部署名の数がカウントされます。結果はnum_departmentsという別名で返されます。
※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。
- MicroDicomのDICOM viewerに複数の脆弱性、悪用で機微な医療画像の不正操作や任意コード実行の恐れ
- 東芝テックと沖電気の複合機に複数の重大な脆弱性、任意のコード実行や情報漏洩の恐れ
- EmEditor最新版にAI機能が統合、チャットやプロンプト定義で利便性向上、正規表現でのファイル検索も
- Opera OneがWindows on Armにネイティブ対応、Snapdragon搭載PCで長時間・高速ブラウジングを実現
- Chrome126リリース、View Transitions APIやCloseWatcher APIなど機能が充実
- Chrome 126が安定版リリース、21件の脆弱性を修正しセキュリティ強化
- Windows最新アップデートとサポート終了、移行とクラウド管理の留意点
- 32bit版のSlackアプリ(Windows)の提供が終了、64bit版への移行を推奨
- Windows 11 Insider PreviewがビルドM20をリリース、新機能を段階的にロールアウト
- Recall機能をプレビュー版で搭載したCopilot+ PCsが発売、セキュリティやプライバシーなどの懸念点について
スポンサーリンク