公開:

SQLのDISTINCT句とは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


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で確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「コンピュータ」に関するコラム一覧「コンピュータ」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。