イントロ
営業戦略を立てる上で顧客データや行動を知るのは大事ですよね。僕の勤めている会社でも営業の方から〇〇のデータが欲しい、xxの現状を知りたいとお願いされることがあります。今回はそんな営業の方達が簡単なデータなら自分たちでいつでも調べられるように、社内で営業向けSQL勉強会を開いた際の手順を投稿させていただきます。
今回は社内勉強会第二回開催しますので、この記事は第二回目の勉強会内容について投稿しています。
今回の目標
テーブル結合を習得すること
前回のSELECT文が把握した上で、関連性があるの複数テーブルからデータを検索して取得できるように
前回勉強会の詳細をご覧ください:
https://qiita.com/TakaoSone/items/34abf475ead31e48b985
勉強会の進め方
以下の手順で勉強会を進めました。
- 前回の内容を復習
- 復習課題
- テーブル結合(JOIN)の説明
- 練習課題
前回の内容を復習
- SQLの基本概念について
(テーブル/ レコード/カラム/データベース)
復習課題
- データの取得: SELECT, FROM
SELECTは取得したいカラムを指定します。
FROMは取得したいデータがあるテーブルを指定します。
今データベースの中で、usersテーブルとpostsテーブルが存在している
- 復習:
usersテーブルのidとnameを取得する
SELECT id, name FROM users;
- postsテーブルのidを取得する
- postsテーブルのidとnameを取得する
テーブル結合(JOIN)の説明
「結合」は複数のテーブルをひっつけるという意味です。複数のテーブルを結合して、1つの結果にまとめたいときに使います。
「両方のテーブルにある行」のみを取り出して結合することを内部結合と言います。
SELECT テーブル名1.フィールド名, テーブル名2.フィールド名
FROM テーブル名1
JOIN テーブル名2
ON テーブル名1.フィールド名 = テーブル名2.フィールド名;
流れを簡単に説明すると、
SELECTに続けて、どのテーブルのどのフィールドデータをそれぞれ取り出すのかということを「テーブル名.フィールド名」で明示し、「,」で区切っていきます。
それからFROMで結合の基準となるテーブル名を書き、JOINでもう一方のテーブル名を書きます。
最後に、ONで各テーブルのどのフィールドを基準に紐づくのかを=で繋いで書きます。
例:
「usersテーブル」のユーザー名nameと「user_informationテーブル」のユーザー趣味hobbyを両方撮りたい時、
まずこんな感じて書いてみよう:
SELECT users.name,user_information.hobby FROM users
エラーになりましたね。。
じゃ、次はuser_informationテーブルを繋げるようにJOINしてみましょう。
SELECT users.name,user_information.hobby FROM users
inner join user_information
なんか結果おかしいですね。。
オッケー、最後、どんな条件どんなフィールドを基準に二つのテーブルを繋いてるを確認して、onの中で書きましょう。最後セミコロンを忘れないようにご注意してください!
SELECT users.name, user_information.hobby FROM users
inner join user_information on (users.id = user_information.user_id);
練習課題
-
- usersテーブルのpost_id,nameを取得する
SELECT users.post_id, users.name FROM users;
-
- usersテーブルのpost_id,nameとpostsテーブルのcommentsを取得する。
条件: usersテーブルのpost_idとpostsテーブルのidは一致している
- usersテーブルのpost_id,nameとpostsテーブルのcommentsを取得する。
SELECT users.post_id, users.name, posts.comments FROM users
JOIN posts on (users.post_id = posts.id);
-
- usersテーブルのpost_id,nameとpostsテーブルの「created」を取得する。
条件: usersテーブルのpost_idとpostsテーブルのidは一致している
- usersテーブルのpost_id,nameとpostsテーブルの「created」を取得する。
SELECT users.post_id, users.name, posts.created FROM users
JOIN posts on (users.post_id = posts.id);
-
- usersテーブルのid,nameとuser_informationテーブルの「revenue」を取得する。
条件: usersテーブルのidとuser_informationテーブルのuser_idは一致している
- usersテーブルのid,nameとuser_informationテーブルの「revenue」を取得する。
SELECT users.id, users.name, user_information.revenue FROM users
JOIN user_information on (users.id = user_information.user_id);
-
- usersテーブルのid,nameとuser_informationテーブルの「revenue」「hobby」を取得する。
条件: usersテーブルのidとuser_informationテーブルのuser_idは一致している
- usersテーブルのid,nameとuser_informationテーブルの「revenue」「hobby」を取得する。
SELECT users.id, users.name, user_information.revenue, user_information.hobby FROM users
JOIN user_information on (users.id = user_information.user_id);
-
- usersテーブルのid,nameとuser_informationテーブルの「revenue」とpostsテーブルのcommentsを取得する。
条件: usersテーブルのidとuser_informationテーブルのuser_idは一致している
usersテーブルのpost_idとpostsテーブルのidは一致している
- usersテーブルのid,nameとuser_informationテーブルの「revenue」とpostsテーブルのcommentsを取得する。
SELECT users.id, users.name, user_information.revenue, posts.comments from users
JOIN user_information on (users.id = user_information.user_id)
JOIN posts on (users.post_id = posts.id);