RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【SQL入門】DISTINCT 使い方

技術広報のyayawowoです。

皆様、SQLのDISTINCTはご存知でしょうか?
DISTINCTを覚えることにより、SQLの実行結果がとても見やすくなります!

本記事では、DISTINCTの基本的な使い方、GROUP BYとの違いなどを説明していきたいと思います。
DISTINCTをマスターし、業務効率化を目指しましょう!!

PostgreSQL 関連記事
【SQL入門】INSERT まとめ
【SQL入門】UPDATE まとめ
RDBMSとDBMSについて【初心者向け】
SQLの基本【まとめ】
【RDBMS】PostgreSQLインストール・コマンド入門編

DISTINCTとは

DISTINCTとは、SQLコマンドの一つです。
SELECT文にて出力した実行結果の重複レコードを1つにまとめることができます。

以下、DISTINCTを使った際の実行結果例になります。

  • DISTINCT 🙅
動物 種類 性別
柴犬
柴犬
マンチカン
  • DISTINCT 🙆
動物 種類 性別
柴犬
マンチカン

DISTINCTの使い方

では、DISTINCTの使い方をご説明します。
今回はPostgreSQL 9.6を利用し、ご説明させていただきます。

DISTINCTの基本的な使い方

まず初めに、DISTINCTの基本的な使い方についてです。
DISTINCTは、以下のようにSELECT文と組み合わせて使います!

SELECT
    DISTINCT 列名
FROM
    テーブル名
;

ではまず、サンプルデータの作成をしていきます。
今回は、動物テーブルを使っていきます。

SQL

--テーブル作成
CREATE TABLE sample_animal (
    animal_no integer,
    animal_name text,
    animal_breed text,
    animal_sex text
);

--テストデータ
INSERT INTO sample_animal VALUES (1, '', '柴犬','');
INSERT INTO sample_animal VALUES (2, '', '柴犬','');
INSERT INTO sample_animal VALUES (3, '', 'チワワ','');
INSERT INTO sample_animal VALUES (4, '', 'プードル','');
INSERT INTO sample_animal VALUES (5, '', 'ゴールデン','');
INSERT INTO sample_animal VALUES (6, '', 'マンチカン','');
INSERT INTO sample_animal VALUES (7, '', 'ペルシャ','');
INSERT INTO sample_animal VALUES (8, '', 'ペルシャ','');
INSERT INTO sample_animal VALUES (9, '', 'アメリカンショートヘア','');
INSERT INTO sample_animal VALUES (10, '', 'ラグドール','');

上記SQL文により、動物テーブルが完成しました。 SELECT文で中身を見てましょう。

SQL

--全件検索
SELECT
    *
FROM
    sample_animal
;

◆ 実行結果

animal_no animal_name animal_breed animal_sex
1 柴犬
2 柴犬
3 チワワ
4 プードル
5 ゴールデン
6 マンチカン
7 ペルシャ
8 ペルシャ
9 アメリカンショートヘア
10 ラグドール

では動物テーブルを使い、DISTINCTを使う場合と使わない場合を比較してみたいと思います!
動物名(animal_name)を検索します。

  • DISTINCT 🙅

SQL

---動物名(animal_name)の検索
SELECT
    animal_name
FROM
    sample_animal
;

◆ 実行結果

animal_name
  • DISTINCT 🙆

SQL

---動物名(animal_name)の検索
SELECT
    DISTINCT animal_name
FROM
    sample_animal
;

◆ 実行結果

animal_name

いかがでしょうか?
DISTINCTを使うことにより、重複レコードを1つまとめることができました。
動物テーブルにどんな動物がいるのか知りたい際に、とても便利です。

レコード単位に重複行をまとめる

DISTINCTはレコード単位に複数行をまとめることもできます。
今回も動物テーブルを使い、DISTINCTを使う場合と使わない場合を比較してみたいと思います!

  • DISTINCT 🙅

SQL

---動物名(animal_name)、動物種類(animal_breed)の検索
SELECT
    animal_name,animal_breed
FROM
    sample_animal
;

◆ 実行結果

animal_name animal_breed
柴犬
柴犬
チワワ
プードル
ゴールデン
マンチカン
ペルシャ
ペルシャ
アメリカンショートヘア
ラグドール
  • DISTINCT 🙆

SQL

---動物名(animal_name)、動物種類(animal_breed)の検索
SELECT
    DISTINCT animal_name,animal_breed
FROM
    sample_animal
;

◆ 実行結果

animal_name animal_breed
ラグドール
柴犬
チワワ
ペルシャ
アメリカンショートヘア
マンチカン
ゴールデン
プードル

※ 並び順についての注意点🚨
DISTINCTを使用する際、内部でソートしてから重複を削除するという処理が働くため並び順がおかしくなります。
もし並び順を整えたい場合は、ORDER BYを使った構文に書き換えてください。

COUNTと組み合わせる

次はひと手間加えて、レコード件数の取得をやってみましょう!
レコード件数の取得は、DISTINCTとCOUNTを使って記述します。

まず初めに、
DISTINCTする列が1つの場合にのみ有効な取得方法をご紹介します。

  • COUNT 🙅

SQL

---動物名(animal_name)の検索
SELECT
    DISTINCT animal_name
FROM
    sample_animal
;

◆ 実行結果

animal_name
  • COUNT 🙆

SQL

---出力結果の件数検索
SELECT
    COUNT (DISTINCT animal_name)
FROM
    sample_animal
;

◆ 実行結果

count
2

次に、
DISTINCTする列が複数の場合に有効な取得方法をご紹介します。
動物名(animal_name)と動物種類(animal_breed)の検索を例とします。

CONCATを使い列と列を繋ぎ合わせ、重複レコードを1つにまとめてます。
まずは、COUNTを使わない場合のSQL文と実行結果を見てみましょう。

  • COUNT 🙅

SQL

---CONCATを使った検索
SELECT
    DISTINCT CONCAT (animal_name,animal_breed)
FROM
    sample_animal
;

◆ 実行結果

count
マンチカン
犬チワワ
犬プードル
アメリカンショートヘア
犬柴犬
ラグドール
ペルシャ
犬ゴールデン

上記実行結果の通り、動物名(animal_name)と動物種類(animal_breed)が結合され、重複レコードもまとめられた状態で取得されました。
では次に、この取得結果の件数を確認するため、COUNTを使ってみましょう。

  • COUNT 🙆

SQL

---出力結果の件数検索
SELECT
    COUNT ( DISTINCT CONCAT (animal_name,animal_breed) )
FROM
    sample_animal
;

◆ 実行結果

count
8

出力結果の件数を確認することができました。

GROUP BYとの違いは?

DISTINCTと同様、重複レコードを削除する際にGROUP BYを使用するケースもあります。
違いは以下の通りです。

DISTINCT ・・・重複レコードを排除した形で結果を出力
GROUP BY・・・グループにまとめた結果に対し、何らかの処理を加え出力

SQL文、実行結果の違いも以下にまとめておきます。

  • DISTINCT 🙆

DISTINCTを使った例は以下の通りです。

SQL

---DISTINCTを使った検索
SELECT
    DISTINCT animal_name
FROM
    sample_animal
;

◆ 実行結果

animal_name
  • GROUP BY 🙆

上記DISTINCTの実行結果と同じ取得も、GROUP BYでできます。

SQL

---GROUP BYを使った検索
SELECT
    animal_name
FROM
    sample_animal
GROUP BY
    animal_name
;

◆ 実行結果

animal_name

では、犬と猫のカウントをしたい場合はどうすればよいでしょうか?
このように、グループにまとめた結果に対し、何らかの処理を加え出力したい場合はGROUP BYを利用します。
DISTINCTでは、何らかの処理を加えての出力はできません。

SQL

---GROUP BYを使った出力件数の検索
SELECT
    animal_name,
    COUNT(animal_name) 
FROM
    sample_animal
GROUP BY
    animal_name
;

◆ 実行結果

animal_name count
5
5

実際、DISTINCTを使う頻度は高くないと思います。
しかしがなら、レコード単位に重複行を簡単にまとめたい!と思った際に簡単に活用することができます。
DISTINCTとGROUP BYのどっちを書けばよいか悩んだ際は、実行計画や実速度を比較して適切な選択をいただけますと幸いです。

DISTINCT 使い方 まとめ

DISTINCTの使い方はいかがでしたでしょうか?

DISTINCTは、SELECT文を利用する際に重複レコードを1つにまとめることができるため、覚えておくととても便利な構文です。
今回初めて使った方や、使い方を忘れてしまった方にとって、本内容が少しでもご参考となれば幸いです。

最後までお読みいただきありがとうございました!


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.