DISTINCT で重複を除外する
SELECT 文の結果から重複する行を除外するには DISTINCT を使います。
基本構文
SELECT DISTINCT カラム名 FROM テーブル名;たとえば users テーブルにどんな city があるかを一覧で見たいとき、こう書きます。
SELECT DISTINCT city FROM users;同じ city が複数あっても、結果には 1 回しか出てきません。
DISTINCT なしとの比較
DISTINCT なし
同じ値が複数回出てくる可能性がある
DISTINCT あり
重複が除外され、ユニークな値だけが返る
たとえば users テーブルに東京在住の人が 100 人いた場合、DISTINCT なしだと「東京」が 100 行返ってきますが、DISTINCT ありなら 1 行だけです。
複数カラムでの DISTINCT
複数のカラムを指定すると、その組み合わせで重複を判定します。
SELECT DISTINCT city, age FROM users;この場合、「city と age の組み合わせ」が同じ行だけが除外されます。たとえば「東京, 25」と「東京, 30」は別の行として扱われます。
COUNT と組み合わせる
DISTINCT は COUNT 関数の中でも使えます。
-- 何種類の city があるか
SELECT COUNT(DISTINCT city) FROM users;通常の COUNT(city) だと NULL 以外の行数を数えますが、COUNT(DISTINCT city) だとユニークな値の数を数えます。
| クエリ | 意味 |
|---|---|
| COUNT(city) | city が NULL でない行数 |
| COUNT(DISTINCT city) | city のユニークな値の数 |
DISTINCT の位置
DISTINCT は SELECT の直後に書きます。カラム名の後ろには書けません。
-- 正しい
SELECT DISTINCT city FROM users;
-- 間違い(エラーになる)
SELECT city DISTINCT FROM users;パフォーマンスについて
DISTINCT を使うと、MySQL は内部的に重複を排除する処理を行います。データ量が多いと、それなりに負荷がかかることがあります。
インデックスがあるカラムで DISTINCT を使うと、効率よく処理できる場合があります。ただし、必要のないところで DISTINCT を使うのは避けたほうがよいでしょう。
DISTINCT は「どんな値があるか」を調べたいときや、集計の前処理として便利な機能です。












