(最終更新月:2023年5月)
✔このような方へ向けて書かれた記事となります
「SQLのDISTINCTとは何で、どのように使うのだろうか?」
「SQLのDISTINCTの使い方を学びたい」
「SQLのDISTINCTの具体的な使用例を見て理解したい」
✔当記事を通じてお伝えすること
- SQLのDISTINCTの基本的な使い方
- DISTINCTの応用法
- SQLのDISTINCTを用いた具体的な使用例
この記事では、SQLのDISTINCTの基本的な使い方から、その応用法まで、具体的な例を交えて詳細に説明します。
ぜひ最後までお読みください。
【SQL】DISTINCTの基礎事項
DOSTINCTについて、知っておくべきことをまとめました。
時間がない方も、最低限こちらの内容だけでも理解しておきましょう。
- SQLのDISTINCTとは?
- DISTINCTが使われる場面
- 単一列でのDISTINCT使用例
- 複数列でのDISTINCT使用例
- レコード単位に重複行をまとめる例
- COUNTと組み合わせる使用例
DISTINCTとは?
DISTINCTはSQLのキーワードで、SELECT文と一緒に使用されるもの。
SELECT文で取得される結果の中から重複する行を除外して、一意の行だけを取得します。
例えば、顧客データベースからすべての一意の顧客の都市をリストアップしたい場合などに使用します。
具体的な使用方法はこちらです。
SELECT DISTINCT 列名 FROM テーブル名
DISTINCTが使われる場面
DISTINCTが使えるケースは以下のような場面といえます。
- 列の一意な値の取得:例)顧客テーブルから異なる国のリストを取得する
- データ分析::例)商品テーブルから異なるカテゴリの商品数を取得する
- 集計:例)注文テーブルから異なる顧客の注文数を取得する
- レポート作成:社員テーブルから異なる部門の一覧を表示する
- データの結合:顧客テーブルと注文テーブルを結合して顧客ごとの注文履歴を取得する
それぞれの具体例をご覧ください。
列の一意な値の取得:例)顧客テーブルから異なる国のリストを取得する
SELECT DISTINCT Country FROM Customers;
データ分析::例)商品テーブルから異なるカテゴリの商品数を取得する
SELECT COUNT(DISTINCT Category) FROM Products;
集計:例)注文テーブルから異なる顧客の注文数を取得する
SELECT CustomerID, COUNT(DISTINCT OrderID) FROM Orders GROUP BY CustomerID;
レポート作成:社員テーブルから異なる部門の一覧を表示する
SELECT DISTINCT Department FROM Employees;
データの結合:顧客テーブルと注文テーブルを結合して顧客ごとの注文履歴を取得する
SELECT DISTINCT c.CustomerName, o.OrderDate
FROM Customers c
JOIN Orders o ON c.CustomerID = o.CustomerID;
単一列でのDISTINCT使用例
まずは最も基本的な、単一列でのDISTINCTの使用例から見ていきましょう。
以下に、顧客テーブルから一意な都市を取得するSQL文の例を示します。
SELECT DISTINCT city FROM customers;
これにより、同じ都市名が複数存在する場合でも、その都市名は一度だけ結果に表示されるのです。
複数列でのDISTINCT使用例
こちらは複数列でのDISTINCTの使用例を見ていきます。
こちらは顧客テーブルから一意な都市と国を取得するSQL文の例を示します。
SELECT DISTINCT city, country FROM customers;
このSQL文では、cityとcountryの組み合わせが一意である行だけが取得されます。
例えば以下は、異なる組み合わせです。
- 「Tokyo, Japan」
- 「Tokyo, USA」
レコード単位に重複行をまとめる例
DISTINCTは全ての列が一致する行を除外し、レコード全体で重複する行をまとめられます。
例えば、以下のSQL文では、全ての列が同じである行をまとめています。
SELECT DISTINCT * FROM customers;
このSQL文では、customersテーブルの全ての列が一致する行をまとめ、それぞれの一意なレコードだけが取得されます。
COUNTと組み合わせる使用例
最後に、DISTINCTとCOUNT関数を組み合わせる使用例を見ていきましょう。
以下のSQL文では、一意な国の数をカウントしています。
SELECT COUNT(DISTINCT country) FROM customers;
DISTINCTで一意なcountryの値だけを取得した後、その数をCOUNT関数でカウントしています。
DISTINCTとGROUP BYの違い
DISTINCTとGROUP BYは何が違うのでしょうか?
初心者の方で混乱してしまう方もいらっしゃると思いますので、以下で整理していきましょう。
- GROUP BYとは何か
- DISTINCTとGROUP BYの違いの説明
- GROUP BYとDISTINCTの使用例
GROUP BYとは何か
GROUP BY句は、「指定した列の値が同じ行をグループとしてまとめる」ために使用します。
グループにまとめることで、その合計値や平均値、数などを計算できるようになります。
具体的には以下のような集約関数を使います。
- SUM
- AVG
- COUNT
GROUP BYについて詳しくはこちらで解説しています。
DISTINCTとGROUP BYの違いの説明
DISTINCTとGROUP BYの主な違いは、こちら。
- DISTINCT:行全体の重複を排除する
- GROUP BY:特定の列の値に基づいて行をグループ化する
DISTINCTは結果セットの中でユニークな行を保証するために使用されます。
一方、GROUP BYは特定の列の値に基づいてデータをグループ化し、それに対して集約関数を適用するために使用されます。
GROUP BYとDISTINCTの使用例
以下のSQL文ではGROUP BYを使用して、国ごとの顧客数をカウントしています。
SELECT country, COUNT(*) FROM customers GROUP BY country;
このSQL文でおこなっているのはこちらです。
- country列の値に基づいてデータをグループ化
- れぞれのグループに対してCOUNT関数を適用
結果として、各国の顧客数を取得できます。
一方、以下のSQL文ではDISTINCTとCOUNT関数を組み合わせて、一意な国の数をカウントしています。
SELECT COUNT(DISTINCT country) FROM customers;
このSQL文では、DISTINCTで一意なcountryの値だけを取得した後、その数をCOUNT関数でカウントしています。
これらの違いを理解することは、SQLを使ってデータを分析する上で非常に重要です。
DISTINCTを使った高度なテクニック
DISTINCTの応用した使い方をご説明します。
ここまでの内容を理解していれば、こちらも頭に入れておきたいところです。
- DISTINCTを使ったサブクエリ
- DISTINCTを使った結果のソート
DISTINCTを使ったサブクエリ
DISTINCTはサブクエリと組み合わせて使うことも可能です。
例えばDISTINCTとサブクエリを組み合わせて、各国からのユニークな顧客IDを取得しています。
SELECT DISTINCT customer_id FROM orders WHERE country IN (SELECT DISTINCT country FROM customers);
こちらでおこなっているのは以下のとおりです。
- 内部のサブクエリで、顧客テーブルから一意な国を取得する:()内の箇所
- 顧客テーブルに存在するcountry列をINで判断する:WHERE以下の説明
- 存在する顧客IDをDISTINCTにて重複を除く:DISTINCT customer_id
これにより、各国からの一意な顧客IDを取得することが可能になるのです。
DISTINCTを使った結果のソート
DISTINCTは結果のソートと組み合わせて使えます。
以下のSQL文では、DISTINCTとORDER BYを組み合わせて、一意な国名をアルファベット順にソートしています。
SELECT DISTINCT country FROM customers ORDER BY country;
このSQL文では、まずDISTINCTで一意なcountryの値だけを取得し、その結果をORDER BYでアルファベット順にソートしています。
まとめ
当記事の内容をまとめます。
- DISTINCTは、重複したデータを除外して、データの分析やレポート作成を行う際に非常に便利
- DISTINCTは単一の列だけでなく、複数の列に対しても使用できる
- COUNT関数と組み合わせることで重複を除外した上でデータの数を数えられる
さらに、GROUP BYとの違いや、DISTINCTを用いたサブクエリやソートの高度なテクニックについても触れました。
これらの知識は、データベースを操作する際に非常に重要で、これからのデータ分析の学習においても役立つでしょう。
DISTINCTの使い方を理解し、適切に活用することで、より洗練されたクエリを書くことが可能となります。
今回学んだことを忘れないように、実際のデータベースを使ってDISTINCTを活用したクエリを書いてみることをおすすめします。
以下のような無料で使えるWebサービスでまずはいろいろと触ってみましょう。