【SQL】DISTINCT句を使って重複を除外して検索する

SELECT文を使っていると、重複を除外して一意のデータを取得したい時があります。

このような場合は、重複を除外する文法であるDISTINCT句を使うことで実現できます。

本記事では、DISTINCT句の使い方を具体例を交えて解説しています。また、COUNT関数を併用する方法についても触れています。

DISTINCT句とは

DISTINCT句を使うと指定したカラムの値が一致したレコードを除外して取得できます。一般的に、重複したデータを除外したい時に使います。

基本の使い方

DISTINCT句の基本構文は下記です。

SQL
SELECT DISTINCT カラム名1 [,カラム名2, カラム名3, ...]
FROM テーブル名;

DISTINCTの後にカラムを指定することで、指定したカラムの重複を除外することができます。

また、カラムは1つだけでなく複数指定することも可能です。複数指定した場合は、複数のカラムで値が重複しているレコードが除外されます。

具体例を見ていきましょう。

カラムを指定して重複行を除外する

まずは、一つのカラムを指定して重複行を除外する方法です。

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnameemail
1山田yamada@gmail.com
2鈴木suzuki@gmail.com
3佐藤sato@gmail.com
4山田yamada@gmail.com
5鈴木suzuki@gmail.com
usersテーブル

検索クエリ

usersテーブルから一意のメールアドレスを取得する

SQL
SELECT DISTINCT email
FROM users;

emailカラムの前にDISTINCTを記載しています。

実行結果

email
yamada@gmail.com
suzuki@gmail.com
sato@gmail.com
usersテーブル

yamada@gmail.comsuzuki@gmail.comを値に持つレコードが複数存在していたので、DISTINCTを指定したことで除外することができました。ユーザーの重複を除外したことで、正確なユーザー数を計測することができます。

複数のカラムを指定して重複行を除外する

DISTINCTは複数のカラムを指定して重複行を除外することができます。

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnameaddress
1山田東京都
2鈴木神奈川県
3佐藤北海道
4山田大分県
5鈴木神奈川県
usersテーブル

検索クエリ

usersテーブルから名前と住所が重複していない一意のデータを取得する

SQL
SELECT DISTINCT name, address
FROM users;

DISTINCTの後にカンマ区切りでカラムを指定することで、複数のカラムに対してDISTINCTを適用することができます。今回の例であればnameaddressの両方にDISTINCTが適用されます。

実行結果

nameaddress
山田東京都
鈴木神奈川県
佐藤北海道
山田大分県
usersテーブル

IDが5のレコードのみ名前と住所がそれぞれ「鈴木」と「神奈川県」で重複していたため除外されています。一方で、IDが4のレコードは「山田」という名前は重複していますが、住所は「大分県」で重複していないため除外されていません

このように、複数のカラムの値が重複しているレコードを除外することもDISTINCTで実現できます。

COUNT関数を併用する方法

重複を除外したデータの件数を数えたい場合は、COUNT関数を併用することで実現できます。例えば、重複を除外したユーザー数をカウントしたい場合などが考えられるでしょう。

基本構文は下記です。

SQL
SELECT COUNT(DISTINCT カラム名)
FROM テーブル名;

COUNT関数の後にカッコでDISTINCT カラム名を指定します。もちろん、DISTINCTで複数のカラムを指定することも可能です。

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnameemail
1山田yamada@gmail.com
2鈴木suzuki@gmail.com
3佐藤sato@gmail.com
4山田yamada@gmail.com
5鈴木suzuki@gmail.com
usersテーブル

検索クエリ

ユーザーの重複を除外した上で、何名の登録があるかをカウントする

SQL
SELECT COUNT(DISTINCT email)
FROM users;

実行結果

count(distinct email)
3
usersテーブル

カラム名はSELECT文で指定した検索条件がそのまま表示されてしまって分かりづらいです。このような場合は、AS句を使って別名を設定してあげると親切ですね。

COUNT関数については下記で詳しくまとめています。

【SQL】COUNT関数でレコード数を取得する

内容のまとめ

  • DISTINCT句はSELECT文で指定したカラムの値が一致したレコードを除外して取得できる
  • DISTINCT句はSELECT文の後にDISTINCT カラム名とすることで、指定したカラムの重複を除外する
  • カラムをカンマ区切りで複数指定することで、複数のカラムの値が重複したレコードを除外できる
  • 重複を除外したデータの件数をカウントしたい場合は、COUNT関数を使うことで実現できる