いろは2986023 views
小学算数1194618 views
世界の国560595 views
小学理科717236 views
小学社会308636 views
LaTeX957300 views
高校化学2913383 views
高校物理158224 views
教育148875 views
高校国語785655 views
Help
Tools

English

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 は「どんな値があるか」を調べたいときや、集計の前処理として便利な機能です。