SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita
の続き
スコープ
- テーブル同士をくっつけて集計できるようになる
- 具体的には、「LEFT JOIN」を学ぶ
- その際に必要となる「ON句」もマスターする
なお、「LEFT JOIN」で殆どの集計ができることから、意図的に他のJOINはスコープ外に置きます。
他には「INNER JOIN」「CROSS JOIN」「OUTER JOIN」などがあるので、興味があれば調べてください。
その前に
Excelと違って、データベースはテーブル数を贅沢に使って情報を貯めることが多いです。
このように、各テーブルが、データを重複なく持っているような状態を「正規化」されていると言います。
詳しくは、データベース正規化 | リレーショナルデータベースのテーブル設計をする上で必要な知識。が詳しいです。
なお、このように正規化されたDBを、テーブル間が相互に関係をもっていることから、
リレーショナル・データベース(RDB)といい、この状態から集計するために「LEFT JOIN」は大変重要です。
基本構造
テーブル①
LEFT JOIN テーブル② ON テーブル①のカラム = テーブル②のカラム
とすると、テーブル①にテーブル②がくっつきます。
例を見たほうが早いです。
例えば
Premium_UserテーブルにIDがある人を課金ユーザとした上で、
課金ユーザの身長・性別が知りたい
SELECT *
FROM
Premium_User pu
LEFT JOIN Profile p ON pu.user_id = p.user_id
Premium_User pu
はPremium_Userというテーブルにpuというあだ名(alias名)を付けるという意味で、
Profile p
も同様にpというあだ名がつけられています
それを踏まえて、FROMの中を見てみると、
Premium_User pu
LEFT JOIN Profile p ON pu.user_id = p.user_id
これは、
「Premium_UserにProfileをくっつけます。」
「その時、puのユーザIDとpのユーザIDが等しいもの同士でくっつけてください」
という意味です。
その結果、こんなくっつき方をしました。
なお、Profileのくっつける先がなかったレコードは無視されます。
課金ユーザの人数と、平均身長がしりたい
では、集計関数も組み合わせてつかってみましょう。FROMの中は変わりません。
SELECT COUNT(*), AVG(p.身長)
FROM
Premium_User pu
LEFT JOIN Profile p ON pu.user_id = p.user_id
GROUP BY 1
すこし複雑になってきましたが、JOINを使うなど、複雑なことをして集計する場合は、
集計まえのテーブルのイメージを持つことが大事です。
FROMのなかに、
がいるから、集計すると
こうなるな、というイメージを持ってください。
推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
前後の記事
SQLデータ分析入門#1『SQLってなんだ』 - Qiita
SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita
SQLデータ分析入門#3『WHERE句を理解する』 - Qiita
SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita
SQLデータ分析入門#5『集計関数を理解する』 - Qiita
SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita
SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita
SQLデータ分析入門#8『基本的な関数を知る』 - Qiita