技術広報の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つにまとめることができるため、覚えておくととても便利な構文です。
今回初めて使った方や、使い方を忘れてしまった方にとって、本内容が少しでもご参考となれば幸いです。
最後までお読みいただきありがとうございました!
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
https://rakus.hubspotpagebuilder.com/visit_engineer/rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com