SELECT文を使っていると、重複を除外して一意のデータを取得したい時があります。
このような場合は、重複を除外する文法であるDISTINCT句を使うことで実現できます。
本記事では、DISTINCT句の使い方を具体例を交えて解説しています。また、COUNT関数を併用する方法についても触れています。
目次
DISTINCT句とは
DISTINCT句を使うと指定したカラムの値が一致したレコードを除外して取得できます。一般的に、重複したデータを除外したい時に使います。
基本の使い方
DISTINCT句の基本構文は下記です。
SELECT DISTINCT カラム名1 [,カラム名2, カラム名3, ...]
FROM テーブル名;
DISTINCT
の後にカラムを指定することで、指定したカラムの重複を除外することができます。
また、カラムは1つだけでなく複数指定することも可能です。複数指定した場合は、複数のカラムで値が重複しているレコードが除外されます。
具体例を見ていきましょう。
カラムを指定して重複行を除外する
まずは、一つのカラムを指定して重複行を除外する方法です。
サンプルデータ
下記のとおり、usersテーブルを用意します。
id | name | |
---|---|---|
1 | 山田 | yamada@gmail.com |
2 | 鈴木 | suzuki@gmail.com |
3 | 佐藤 | sato@gmail.com |
4 | 山田 | yamada@gmail.com |
5 | 鈴木 | suzuki@gmail.com |
検索クエリ
usersテーブルから一意のメールアドレスを取得する
SELECT DISTINCT email
FROM users;
emailカラムの前にDISTINCT
を記載しています。
実行結果
yamada@gmail.com |
suzuki@gmail.com |
sato@gmail.com |
yamada@gmail.com
とsuzuki@gmail.com
を値に持つレコードが複数存在していたので、DISTINCT
を指定したことで除外することができました。ユーザーの重複を除外したことで、正確なユーザー数を計測することができます。
複数のカラムを指定して重複行を除外する
DISTINCTは複数のカラムを指定して重複行を除外することができます。
サンプルデータ
下記のとおり、usersテーブルを用意します。
id | name | address |
---|---|---|
1 | 山田 | 東京都 |
2 | 鈴木 | 神奈川県 |
3 | 佐藤 | 北海道 |
4 | 山田 | 大分県 |
5 | 鈴木 | 神奈川県 |
検索クエリ
usersテーブルから名前と住所が重複していない一意のデータを取得する
SELECT DISTINCT name, address
FROM users;
DISTINCT
の後にカンマ区切りでカラムを指定することで、複数のカラムに対してDISTINCT
を適用することができます。今回の例であればname
とaddress
の両方にDISTINCT
が適用されます。
実行結果
name | address |
---|---|
山田 | 東京都 |
鈴木 | 神奈川県 |
佐藤 | 北海道 |
山田 | 大分県 |
IDが5のレコードのみ名前と住所がそれぞれ「鈴木」と「神奈川県」で重複していたため除外されています。一方で、IDが4のレコードは「山田」という名前は重複していますが、住所は「大分県」で重複していないため除外されていません。
このように、複数のカラムの値が重複しているレコードを除外することもDISTINCTで実現できます。
COUNT関数を併用する方法
重複を除外したデータの件数を数えたい場合は、COUNT関数を併用することで実現できます。例えば、重複を除外したユーザー数をカウントしたい場合などが考えられるでしょう。
基本構文は下記です。
SELECT COUNT(DISTINCT カラム名)
FROM テーブル名;
COUNT関数の後にカッコでDISTINCT カラム名
を指定します。もちろん、DISTINCT
で複数のカラムを指定することも可能です。
サンプルデータ
下記のとおり、usersテーブルを用意します。
id | name | |
---|---|---|
1 | 山田 | yamada@gmail.com |
2 | 鈴木 | suzuki@gmail.com |
3 | 佐藤 | sato@gmail.com |
4 | 山田 | yamada@gmail.com |
5 | 鈴木 | suzuki@gmail.com |
検索クエリ
ユーザーの重複を除外した上で、何名の登録があるかをカウントする
SELECT COUNT(DISTINCT email)
FROM users;
実行結果
count(distinct email) |
---|
3 |
カラム名はSELECT文で指定した検索条件がそのまま表示されてしまって分かりづらいです。このような場合は、AS句を使って別名を設定してあげると親切ですね。
COUNT関数については下記で詳しくまとめています。
【SQL】COUNT関数でレコード数を取得する内容のまとめ
- DISTINCT句はSELECT文で指定したカラムの値が一致したレコードを除外して取得できる
- DISTINCT句はSELECT文の後に
DISTINCT カラム名
とすることで、指定したカラムの重複を除外する - カラムをカンマ区切りで複数指定することで、複数のカラムの値が重複したレコードを除外できる
- 重複を除外したデータの件数をカウントしたい場合は、COUNT関数を使うことで実現できる