一意な値を数える
COUNT(DISTINCT ...)を実際に使います。
「一意な値を数える」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
一意な値を数える理由
COUNT(*) を使用すると、重複を含むすべての行を数えます。しかし、列にいくつの一意な値が存在するかだけを知りたい場合もあります。
たとえば、顧客は何か国から来ているでしょうか。先月は何種類の一意な商品が注文されたでしょうか。このような場合に COUNT(DISTINCT ...) が役立ちます。
サンプルテーブルを準備する
練習用に orders テーブルを作成しましょう。各注文には、顧客名、商品、国が記録されています。
一部の顧客や国が複数回登場することに注目してください。これは意図的なもので、すべての行を数える場合と一意な値を数える場合の違いを確認するためです。
CREATE TABLE orders (
id INT,
customer VARCHAR(50),
product VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Laptop', 'USA'),
(2, 'Bob', 'Phone', 'UK'),
(3, 'Alice', 'Tablet', 'USA'),
(4, 'Carol', 'Laptop', 'Canada'),
(5, 'Bob', 'Laptop', 'UK'),
(6, 'Dave', 'Phone', 'USA'),
(7, 'Carol', 'Phone', 'Canada'),
(8, 'Eve', 'Tablet', 'Germany');COUNT(*) と COUNT(DISTINCT) の比較
両方のクエリを実行して、結果を比較してください。COUNT(*) は各行につき1つとして、8を返します。COUNT(DISTINCT customer) は、一意な顧客が5人(Alice、Bob、Carol、Dave、Eve)しかいないため、5を返します。
これが基本的な考え方です。COUNT(DISTINCT column) は繰り返し現れる値を無視し、一意な値だけを数えます。
SELECT COUNT(*) AS total_orders,
COUNT(DISTINCT customer) AS unique_customers
FROM orders;一意な国の数を数える
顧客が何か国から来ているかを調べましょう。orders テーブルには8行ありますが、複数の行で同じ国が指定されています。
各国が何回登場するかに関係なく、結果は4(USA、UK、Canada、Germany)になります。
SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;一意な商品の数を数える
同じパターンを任意の列に適用できます。ここでは、注文された商品の種類数を数えます。
「Laptop」は3回、「Phone」も3回登場しますが、各商品は1回だけ数えられます。答えは3(Laptop、Phone、Tablet)です。
SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;WHERE と COUNT(DISTINCT) の組み合わせ
COUNT(DISTINCT ...) と WHERE 句を組み合わせると、数える前に対象の行を絞り込めます。ここでは、USA の顧客だけが注文した一意な商品の数を数えます。
country = 'USA' である行だけが対象となり、その後、それらの行に含まれる一意な商品を数えます。
SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';GROUP BY と COUNT(DISTINCT)
GROUP BY と組み合わせると、COUNT(DISTINCT ...) によってグループごとの一意な値の件数を取得できます。このクエリは、国ごとに何人の一意な顧客が注文したかを答えます。
各グループは独立して処理されるため、グループ内の重複は数える前に削除されます。
SELECT country,
COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;複数列の一意な値を数える
1つの SELECT で複数の COUNT(DISTINCT ...) 式を使用できます。これにより、各列が持つ一意な値の数、つまりカーディナリティを1つのクエリで簡単に把握できます。
カーディナリティは、新しいデータセットを調べる際に役立つ指標です。
SELECT COUNT(DISTINCT customer) AS unique_customers,
COUNT(DISTINCT product) AS unique_products,
COUNT(DISTINCT country) AS unique_countries
FROM orders;NULL の扱い
通常の COUNT(column) と同様に、COUNT(DISTINCT column) は NULL 値を無視します。NULL は一意な値として数えられません。
この例では、2行の国が NULL です。結果は5ではなく、NULL ではない一意な国が4になります。
INSERT INTO orders VALUES
(9, 'Frank', 'Phone', NULL),
(10, 'Grace', 'Laptop', NULL);
SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;COUNT(*)、COUNT(col)、COUNT(DISTINCT col) の比較
3種類の COUNT の形式を並べて確認すると分かりやすいでしょう。
- COUNT(*) — NULL を含むすべての行を数えます
- COUNT(country) — country が NULL ではない行を数えます
- COUNT(DISTINCT country) — NULL ではない一意な country の値を数えます
更新後のテーブル(現在は10行で、そのうち2行の country が NULL)に対して実行し、違いを確認してください。
SELECT COUNT(*) AS total_rows,
COUNT(country) AS non_null_countries,
COUNT(DISTINCT country) AS unique_countries
FROM orders;実践例:デイリーアクティブユーザー
分析における COUNT(DISTINCT ...) の最も一般的な用途の1つが、デイリーアクティブユーザー(DAU)の集計です。イベントのログから、毎日何人の一意なユーザーがアクティブだったかを知りたい場合に使用します。
日付で GROUP BY し、COUNT(DISTINCT user_id) を使うと、日ごとの一意なユーザー数を取得できます。同じユーザーが何度もクリックしたことによる重複は自動的に除外されます。
CREATE TABLE user_events (
event_date DATE,
user_id INT
);
INSERT INTO user_events VALUES
('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
('2024-01-03', 1), ('2024-01-03', 4);
SELECT event_date,
COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;理解度チェック
COUNT(DISTINCT ...) について、この問題で理解度を確認しましょう。
レッスンのまとめ
よくできました。COUNT(DISTINCT ...) について、次のことを学びました。
COUNT(DISTINCT column)は、列内の一意で NULL ではない値だけを数えます。COUNT(*)(すべての行)やCOUNT(column)(NULL ではない行)とは異なります。- WHERE と組み合わせて、数える前に行を絞り込めます。
- GROUP BY と組み合わせて、グループごとの一意な値を数えられます。
- NULL 値は一意な値の件数から常に除外されます。
- 同じ SELECT に複数の
COUNT(DISTINCT ...)式を記述できます。 - 実際の用途として、一意なユーザー、商品、国、セッションの数を数えることなどが挙げられます。
この関数を使いこなすと、データの探索や分析に役立つ強力な手段を得られます。
よくある質問
「一意な値を数える」レッスンは無料ですか?
はい。「一意な値を数える」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「一意な値を数える」で何を学びますか?
COUNT(DISTINCT ...)を実際に使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「一意な値を数える」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。