フィードフォースの社内勉強会を大公開!「Biz の人も知っていると役に立つかも知れない SQL 講座」
こんにちは!フィードフォース note 編集部です。2023 年 9 月に社内のマーケターが開催した社内勉強会「Biz の人も知っていると役に立つかも知れない SQL 講座」の内容をお届けします。
フィードフォースは社内勉強会が活発
私は何度か転職をしてフィードフォースが 7 社目の人間ですが、過去の会社と比較してフィードフォースは社内勉強会が活発です。社内勉強会に限らず、有益なスキル・ノウハウ・情報を社内 Wiki やチャットで積極的に共有する文化があります。
これはフィードフォースの 4 つのバリューの 1 つである「チーム、ファースト」を、みんなが実践しているから。
エンジニアとデザイナーが自主的に開催している技術勉強会は、なんと 10 年も続いており、開催は 500 回を超えています!
その他にも、
生成 AI
広告運用
マーケティングトレンド
などの勉強会を社員が自主的に行っています。最近では社長の塚田が経営勉強会を開き、多くの社員が参加しています。学ぶ意欲の高さから、目の前の業務に直結しない内容でも積極的に参加している様子がよく見られます。
ここからは「Biz の人も知っていると役に立つかも知れない SQL 講座」で紹介した、SQL の基本と応用をお届けします。
Biz の人も知っていると役に立つかも知れない SQL 講座
ゴールと想定リテラシー
「Biz」はビジネスのメンバー(≒非エンジニア)のこと。講座では以下の 2 つがゴールです。
他の人が書いた SQL の内容がザックリわかる
それをコピーして、いじることができる
受講者の想定リテラシーは下記のとおりです。
Excel もしくは Google スプレッドシートで、
基本的な関数が使える(vlookup、countif など)
フィルターが使える
1,000 行を超えるようなデータを扱ったことがある
Biz の人が SQL をかじるメリット
非エンジニアの私が SQL を書けるようになったのは 7~8 年前。実体験から以下のようなメリットを感じています。
エンジニアへの依頼がスムーズに
SQL を知らないとデータ抽出の依頼が、「hogehoge の売上を出してほしい」というザックリした内容になりがちです。エンジニアから、「どのテーブルの何のカラムをどういう期間と条件で抽出すればいいですか?」などと質問を受けた経験はありませんか?
SQL をかじっていれば、「売上が入っているテーブル『total_sales』から total_price の合計値を 2023 年 1 月~12 月の期間で、status が completed のものを集計してください」と、具体的な依頼ができるようになります。
ちょっとカッコ良くないですか?能動的にデータ抽出・分析ができて、仕事が楽しくなる
データを「見たい」「気になる」となったタイミングで、自分でサッと抽出できると仕事が楽しくなります。自分でデータを深堀りできるようになり、仕事の幅が広がります。
自分も関係者も仕事のスピードがあがる
簡単な条件であれば自分でデータ抽出ができるようになるため、依頼をする手間がなくなり仕事のスピードがあがります。エンジニアが簡単な依頼に工数をかけることも無くなります。
とはいえ複雑な条件だとエンジニアに依頼が必要なケースはあります。しかし、細かい条件を会話できるリテラシーがあれば、「データが出てきたら意図した条件じゃなかった!」といった手戻りが防げて、チーム全体の仕事のスピードがあがります。Biz + SQL はキャリアの希少性が高い
私はマーケターですが、SQL を書ける人は肌感覚で 1~2 割しかいません。セールスやカスタマーサクセスでも、同じくらいの割合ではないでしょうか?大規模なデータベースが存在する会社では、SQL が少しわかるだけで社内での希少性が爆上がりするはずです。
フィードフォース社内には SQL を書いてプロダクトの利用状況を取得できる環境があり、ビジネスメンバーも利用が可能です。SQL の基礎知識があれば社内 KPI の集計の自動化や、ユーザーの利用状況の調査がスムーズになります。
SQL とは?
Search Query Language の略で、データベースを操作するための言語です。具体的にはデータベースに以下の操作を指示します。
データベース(テーブル)の作成
データの格納(追加)
データの抽出
データの書き換え(更新)
今回は、Biz の人が最初に理解しておきたい「データの抽出」に絞って説明します。以下のような SQL を読み解き・書けるようになりましょう!
テーブルとは?
SQL の読み書きの前に、「テーブル」について説明します。「テーブル」はデータが格納されている場所で、Google スプレッドシート や Excel の 1 シートと考えてください。
テーブルのカラム(列)はデータ型などの定義が決められています。Google スプレッドシートや Excel のセルに、数値・日付などのデータ型があるのと同じです。一般的には、各テーブルの定義がまとまった仕様書が準備されています。
テーブルの種類
テーブルには以下の 2 種類が存在します。
トランザクションテーブル
日々、新しいデータが追加・蓄積されるテーブル。データが確定すると、変更・更新されることが無い。たとえば・・・
・EC サイトの注文情報
・サイトやアプリのアクセスログ
・月ごとの請求金額
などがあるマスタテーブル
商品や契約、個人情報などの基本データが入ったテーブル。内容が変更・更新される。たとえば・・・
・商品情報
・顧客情報
・請求先の情報
・契約内容
などがある
SQL の基本構成
SQL は以下の 3 パートで構成されています。
select:取得したいデータのカラム(列)を選ぶ
from:データを取得したいテーブルを選ぶ
where:データを絞り込む(フィルター)
記述の順番と異なり、以下の番号順でデータが処理されます。
③select:取得したいデータのカラム(列)を選ぶ
①from:データを取得したいテーブルを選ぶ
②where:データを絞り込む(フィルター)
SQL 初心者は処理の順番に合わせて、「①from → ②where → ③select」の順番で書いていくのがオススメです。
ここからは実際に「2023 年 12 月の日別の売上」を集計する SQL を書いてみましょう。最終的に出したい数字はこちらです。
ステップ①from:データを取得したいテーブルを選ぶ
売上の情報は「テーブル:table_sales」に格納されています。下図のようなイメージです。データを取得するテーブルは「from テーブル名」と書いて指定します。
今回の場合は、「from table_sales」です。
ステップ②where:データを絞り込む(フィルター)
次にテーブルを必要な情報だけに絞り込みます。抽出したいのは「2023 年 12 月の売上」ですが、テーブルには「2024 年 1 月」の売上や「キャンセル」の注文が含まれています。
条件を絞り込む際は「where 条件① and 条件② and ・・・」と記述します。「and」を使うことで複数の条件で絞り込むことが可能です。
今回は、
「where date between ‘2023-12-01’ and ‘2023-12-31’ and status = completed」
と記述します。
「date between ‘2023-12-01’ and ‘2023-12-31’」で「2023 年 12 月 1 日〜2023 年 12 月 31 日」という条件を指定しています。日付の期間を指定する場合は「between 日付① and 日付②」と記述します。
「status = completed」で注文が完了したデータだけに絞りこんでいます。
「where」のあとに
「date between ‘2023-12-01 00:00:00’ and ‘2023-12-31 23:59:59’」と
「status = completed」を「and」でつなげれば完成です。
ステップ③select:取得したいデータのカラム(列)を選ぶ
抽出したいデータを再確認すると「日付」と「売上」の 2 つです。
「table_sales」から、必要な「日付(date)」と「売上(total_price)」の項目だけ抽出します。
「select 項目①,項目②,・・・」と必要な項目を「,(カンマ)」で区切って記述します。
今回の場合は、
「select date,total_price」
となります。
ステップ①~③の SQL をつなげる
「③select → ①from → ② where」の順番でつなげて最後に「;(セミコロン)」で締めます。①~③ が表す処理の順番とは異なるので、注意してください。
つなげた結果はこちら
なんだか見にくいですね。「改行」「インデント」は SQL の実行時に読み飛ばしてくれるので、以下のように見やすくしましょう。
では、この SQL を実行してみます。
結果はこちら・・・
一見、求めていたデータのようで、微妙に異なります。2023/12/04 や 2023/12/08 の売上が合計されずに、複数の行に分かれています。
複数行のデータを集計する場合は select の中で「sum 関数」を使用します。
「sum(項目)」という形で記述し、「どの項目で集計するか」を「group by 項目」で指定します。
今回の場合は、
売上を集計:sum(total_price)
日別に集計:group by date
と記述します。
sum 関数は select の中に記述しますが、group by は where の後ろに記述するルールです。完成した SQL がこちら。
実行すると以下の結果が得られます。イイ感じですね。
見出しが「date」「sum(total_price)」だと、項目の内容がわかりにくいので、日本語に変えてみましょう。
select の中で「項目 as “任意の名前”」と書くことで、好きな名前に変えることができます。関数を使うと「sum(total_price)」のように読みにくくなるので、わかりやすい名前をつけるのがオススメです。
実行すると以下の結果が得られます。わかりやすくなりましたね。
最後に日付を昇順に並び替えます。指定の項目での並び替えは「order by」を使用します。以下のように「group by」の下に記述します。
これで日付の昇順に並び替えられました。
ここまでが SQL の基礎となる部分です。
関数は紹介したもの以外もあり、環境によって使える関数が異なります。詳しくは使っている環境のヘルプなどをご確認ください。
応用編:複数のテーブルからデータを抽出する「join」
次は、商品ごとの売上を抽出してみます。
売上が格納されている「table_sales」からデータを抽出しますが、残念ながら「商品名」の項目がありません。
商品名は別のテーブル「product_info」にあります。
Google スプレッドシート や Excel なら「vlookup 関数」を使って、2 つのテーブルからデータを抽出できますよね。SQL で「vlookup 関数」に該当するのが「left join」です。
Biz の人は「left join」だけを「vlookup」だと思って使おう
「join」については、以下の 4 種類があります。
left join
right join
innner join
full join
Biz の人はとにかく「left join」だけを「vlookup」だと思って使いましょう。
他の join について詳しく知りたい方は、以下のサイトを参考にしてください。
※参考:JOIN (結合)の基本と種類について|SQL Server 入門
「left join」の記述方法
今回は product_id を key にして 2 つのテーブルを結合し、必要なデータを抽出します。
「left join 結合するテーブル名 on 元テーブルの key = 結合するテーブルの key」と記述します。実際に SQL を見てみましょう。
複数のテーブルを結合する場合、select の中では「どのテーブルの項目」を抽出するか指定する必要があります。たとえば「product_id」の項目は、「table_sales」「product_info」の両テーブルに存在するため、どちらのテーブルの「product_id」かを指定しないとエラーになります。
テーブル名は「from」や「left join」でテーブルを指定する際に、「from table_sales 任意の名前」とすることで、表記を省略することができます。以下では、「table_sales」を「a」、「product_info」を「b」としています。見た目がかなりスッキリしましたね。
SQL を学ぶ参考情報
いかがでしたでしょうか?
より詳しい内容を勉強したい方にオススメの書籍は「10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く」です。
サイバーエージェントさんがブログで公開している資料も勉強になります。エンジニア向けなので、Biz の方は気になる部分だけ読むといいでしょう。
参考:社内SQL研修のために作った資料を公開します | 株式会社AI Shift (ai-shift.co.jp)
最後に・・・
私の経験上、SQL はとにかく数を書いたもの勝ちです。毛嫌いせずに数をこなしましょう。
この記事が、みなさんの SQL に対する苦手意識を減らせたら嬉しい限りです。最後まで読んでいただき、ありがとうございました!