【SQL入門】DISTINCTで重複行をまとめる方法をわかりやすく解説

こんにちは!システムエンジニアのオオイシです。

SQLのDISTINCT(ディスティンクト)をご存知ですか?DISTINCTの使い方を覚えると、SELECT文の実行結果の重複レコード(データ行)を1つにまとめることができます。

この記事では、

  • DISTINCTとは
  • DISTINCTの使い方
  • 複数列でDISTINCTを使ってみる
  • DISTINCTする列が1つの場合のレコード件数取得方法
  • DISTINCTする列が複数の場合のレコード件数取得方法


などの基本的な解説から応用的な使い方関しても解説していきます。

今回はそんなDISTINCTの使い方をわかりやすく解説します!

DISTINCTとは

DISTINCTとは、SELECT文の実行結果の重複レコード(データ行)を1つにまとめるための便利な構文です。

例えば、従業員テーブルに「姓、名」の項目があるとして、同姓同名が複数行ある場合にDISTINCTを使うと次のように1レコードになります。

sql_distinct_1

そんなDISTINCTの使い方を次項で解説していきます!

DISTINCTの使い方

DISTINCTの構文はSELECT文の後に追加して、次のように記述します。

  • SELECT DISTINCT 列名,列名... FROM テーブル名


従業員テーブルの「姓(last_name)」を検索する例について、DISTINCTを使わない場合と使う場合の2つを比較したサンプルコードを確認してみましょう。

サンプルデータの作成:

CREATE TABLE sample1_employees (
    no int NOT NULL,            -- 従業員番号
    last_name varchar(255),     -- 名
    first_name varchar(255),    -- 姓
    PRIMARY KEY (no)            -- 主キー
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
-- テストデータ
INSERT INTO sample1_employees VALUES('10001', '侍','太郎');
INSERT INTO sample1_employees VALUES('10002', '侍','太郎');
INSERT INTO sample1_employees VALUES('10003', '侍','次郎');

DISTINCTを使わない場合:

mysql> SELECT last_name from sample1_employees;
+-----------+
| last_name |
+-----------+
| 侍        |
| 侍        |
| 侍        |
+-----------+
3 rows in set (0.00 sec)

DISTINCTを使う場合:

mysql> SELECT DISTINCT last_name from sample1_employees;
+-----------+
| last_name |
+-----------+
| 侍        |
+-----------+
1 row in set (0.00 sec)

このように、DISTINCT を使うと重複レコードを1つにまとめることができました。

次に、SELECTが複数の列のときにDISTINCTを使うとどのようになるか解説していきます。

複数列でDISTINCTを使ってみる

SELECT文で複数列の検索結果が得る場合にDISTINCTを使うと、レコード(データ行)単位に重複行がまとめられます

従業員テーブルの「姓(last_name)と名(first_name)」を検索する例について、DISTINCTを使わない場合と使う場合の2つを比較したサンプルコードを確認してみましょう。

DISTINCTを使わない場合:

mysql> SELECT last_name, first_name from sample1_employees;
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| 侍        | 太郎       |
| 侍        | 太郎       |
| 侍        | 次郎       |
+-----------+------------+
3 rows in set (0.00 sec)

DISTINCTを使う場合:

mysql> SELECT DISTINCT last_name, first_name from sample1_employees;
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| 侍        | 太郎       |
| 侍        | 次郎       |
+-----------+------------+
2 rows in set (0.00 sec)

このように、「姓(last_name)と名(first_name)」の2列で同じレコードは1レコードにまとめて表示できることが確認できました。

次に、DISTINCTした結果のレコード件数を調べる方法について解説していきます。

DISTINCTとCOUNTを併用して使ってみる

DISTINCTして検索したレコード件数を数えるためには、件数を数えるCOUNT関数を併用します。

COUNT関数の構文は、次のように、

  • SELECT COUNT(列名) FROM テーブル名


と書きますが、引数が1つだけなので、列名が複数の場合は工夫が必要です。

今回は、DISTINCTを使ったCOUNT文を使う方法を2つ紹介していきます。

DISTINCTする列が1つの場合のレコード件数取得方法

SELECTする列が1つの場合は、次のようにシンプルに記述できます。

  • SELECT COUNT(DISTINCT 列名) from テーブル名


従業員テーブルの「姓(last_name)」をDISTINCTで重複を1つにまとめた上で、レコード件数を数えるサンプルコードを確認してみましょう。

COUNTを使う前:

mysql> SELECT DISTINCT last_name from sample1_employees;
+-----------+
| last_name |
+-----------+
| 侍        |
+-----------+
1 row in set (0.00 sec)

COUNTを使った結果:

mysql> SELECT COUNT(DISTINCT last_name) from sample1_employees;
+---------------------------+
| COUNT(DISTINCT last_name) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

このように、DISTINCTした結果の件数を数えることができました。

つづいて、SELECTする列が複数の場合について解説していきます。

DISTINCTする列が複数の場合のレコード件数取得方法

SELECTする列が複数の場合は、列と列が1つになるように繋いだ上で、DISTINCTで重複を除きます。

列と列を繋げるためにはCONCAT関数を併用して、

  • SELECT COUNT( DISTINCT CONCAT(列名,列名...) FROM テーブル名


のように記述します。

従業員テーブルの「姓(last_name)と名(first_name)」をSELECT文で検索し、DISTINCTしたデータ件数を数えるサンプルコードを確認してみましょう。

はじめに、COUNTを使わずにCONCATして列をつなぎ合わせた結果を見てみます。

SELECT
    DISTINCT CONCAT(last_name, first_name) result
FROM
    sample1_employees
実行結果:
+-----------+
| result    |
+-----------+
| 侍太郎    |
| 侍次郎    |
+-----------+
2 rows in set (0.00 sec)

同姓同名の2件のレコードがCONCATで姓名が連結されて検索できました。

これをCOUNTを追加して件数を数えてみます。

SELECT COUNT(
    DISTINCT CONCAT(last_name, first_name)
) result
FROM
    sample1_employees

実行結果:

+--------+
| result |
+--------+
|      2 |
+--------+
1 row in set (0.00 sec)

このように、複数列の場合でもDISTINCTで重複を削除して件数を数えることができました。

まとめ

いかかでしたか?

今回はSQLのDISTINCTについて解説しました。DISTINCTは、SELECT文の重複レコード(データ行)を1つにまとめる便利な構文です。

DISTINCTはSQLを利用する上でよく使う構文なので、ぜひ習得してみてはいかがでしょうか。そして、DISTINCTの使い方を忘れてしまったらこの記事を確認してくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

オオイシ

オオイシ

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
[email protected] まで連絡頂けると幸いです

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説