こんにちは!PIXTA開発チームでアプリケーションエンジニアをしている谷口です。先日、SQLにあまり詳しくないメンバーとペアプログラミング(以下、ペアプロ)をする機会が何回かあり、ペアプロの最中にSQLを伝授できたので、どのようにしたらSQLをペアプロでメンバーに伝授できるのかを言語化してみました。
SQLをメンバーに教えるにあたって大切にしたいことや、省けばいいことなどを中心にお話します。
経緯
PIXTAにはペアプロブースがあり、メンバーとペアプロで課題解決に臨む機会があります。課題解決に臨む際、メンバーと一緒にSQLでデータを参照することがありまして(もちろん個人情報がマスキングされたデータです)、SQLに詳しくないメンバーには、ついでにSQLを教えていました。
そのような形で何回かSQLを教える機会があり、「SQLってゼロから応用まで学ぶのは意外と大変」だということをメンバーから気付かされました。
そこで、基本から応用まで教える方法を言語化して、今後教える際の共通指針としようと思ったのが、この記事を書くことになった経緯です。
なぜペアプロで教えると良いのか?
そもそも、なぜペアプロでSQLを伝授すると良いのか、疑問に思われると思います。確かに、巷にはSQLを解説する本やサイトは多くあるので、それらで独自に学んでもらうのはもちろん良いです。
しかしながら、SQLもご多分に漏れず、会社での実践経験で手っ取り早く吸収できます。というのも、サンプルデータではなく豊富なデータを保持している環境であれば、それをベースに様々なクエリ構築を経験できるからです。
ということで、豊富なデータを保持している環境、例えば会社などでは、ペアプロでSQLを教えるのが大変有効だと思います。
それでは以下、どのようにペアプロで教えたのかを言語化してみます。
1. SQLを理解するメリットをまず伝える
なぜSQLを理解する必要があるのか、その疑問に対しては、学ぶことで得るメリットをまず伝えることで、理解に対するモチベーションを与えることができます。
例えば、RailsだったらActiveRecordを通してモデル経由でデータ引っ張ればいいだけなのでは、というのはよく貰う質問です。
その質問に対して、具体的には以下のようなSQLを理解するメリットを伝えることができると思います。
- ActiveRecordやEntity FrameworkといったO/Rマッパーを介したデータ抽出方法に頼らず、SQLだけでのデータの抽出が可能になる。
- SQLでのデータ抽出やデータ更新がわかっていれば、自分が知らないO/Rマッパーの理解がすぐ可能になる。
- 業務遂行に必要なデータの抽出を他人に頼らず高速に行えるようになる。
- 様々な形式でデータ抽出が可能になることで、簡単なデータ分析ができるようになる。
- データベースと友達になれる!(個人的に一番大事)
2. ペアプロで学ぶ範囲を伝える
次に、どの範囲までを伝授するのか、例えばSELECT句だけをペアプロで伝授するのか、それとも実行計画や照合順序まで伝授するのか等、その全体感を共有すると良いです。
というのも、教えられるメンバーにとっては、SQLが怖い存在でどこまで一気に理解しなければいけないのか・・・と恐怖に感じてしまう可能性があるためです。
私としては、まずは抽出が自在にできるようになると、SQLが楽しい存在になると思うので、"ペアプロを通して、好きなようにデータの抜き出しができるようになるまでSQLを教えるよ"と最初に伝えます。もちろんそれ以上を教えてもいいですが、今回はSELECTの範囲をどう教えるか、を以下言語化してみます。
3. 教える内容は?
SELECTが自在にできるようになるまで教えるとなると、色々教える必要がありますが、以下の順序で教えたらスムーズにSQLを理解してもらえました。もちろん、コマンドを実際に打ってもらいながら教えると良いです。
太字は、特に丁寧に伝えたい内容です。
データベースの基本
- データベースとは
- RDBMSがあって、それに問い合わせる言語がSQLだということ。
- テーブルとは
- ExcelやGoogle スプレッドシートの1シートに相当するのが1テーブルだということ。
- SELECT文、INSERT文、UPDATE文、DELETE文の違い。
- テーブル自体を作ったり、更新することもできるが、それはペアプロの場では割愛するということ。
- 行と列の違いとは
- 行と列の違いの理解が曖昧なままだと、各種クエリの理解度が遅くなるので、改めてここで行と列の違いを伝える。また、行をレコードと呼ぶことにも伝える。
- 型とは
- 日付のデータをどうSQLで表せば良いのか、文字や数字のデータをどう取り扱えばいいのかなど、SQLでの各種データ型の取り扱い方を伝える。
- データベースとは
条件を指定しないSELECT文での抽出の方法
- 全列を取得する方法。
- 列指定した列のみ取得する方法。
- デフォルトの列名ではなく、ASで列名に他の名前をつけて取り出す方法。
WHEREでの行の絞り込みの方法
- テーブルから全行ではなく、特定の条件に合致した行だけを絞り込む方法。
- 絞り込みの際に、型を意識してクエリを書くこと。
- INを使って複数データに合致するデータに絞り込むことができること。
- サブクエリを使った絞り込みの方法があること。
- サブクエリで一意なデータ(1レコード)に絞り込める場合と、サブクエリでは一意なデータに絞り込めず、複数のレコードになる場合で、= と IN を使い分ける必要があること。
GROUP BYで、データを集計して表示する方法
- 単一列の指定だけではなく、複数列でもグループ化ができること。
- SUMやAVG、COUNTといった集合関数を使えば、グループ化した数値の取り扱いができるということ。
- HAVINGを使って、GROUP化を行った後のレコードの絞り込みができること。
複数のテーブルのデータをつなげて取り扱う方法
- テーブル結合のイメージ
- 初学者にとっての一番の難関はテーブル結合だと、複数人とペアプロしている中で気づきました。1レコードと1レコードの結合だけではなく、1レコードに複数レコードが紐づく場合が特に頭の中でイメージし辛いようです。そこで、テーブル結合のイメージを図を用いて伝えると効果的でした。
- INNER JOINでテーブルをつなげる方法
- LEFT JOINでテーブルをつなげる方法
- サブクエリで抽出したテーブルに別名をつけることについて
- サブクエリで抽出したテーブルをJOINするとき、一度絞り込んだテーブルには別名をつけなければいけないということ。
- テーブル結合後もWHEREを用いた絞り込みができるということ。
- テーブル結合後に、GROUP BYによるグループ化とWHEREを同時に使った絞り込みについて
- テーブル結合後にGROUP BYを行う場合に、単一テーブルからグループ化までの流れはややこしいので、これも具体的に図を描いて伝えること。
- テーブル結合のイメージ
UNIONでデータを連結する方法
- UNIONで抽出結果を垂直方向に取得結果をつなげることができるということ。
最後に
SQLでデータベースと直に触れ合い、そしてデータベースと友達になり、データベースを愛するようになる。そんな人生を歩んでもらいたいものですね。
ピクスタのサービスを成長させていきたいエンジニアを募集中です! recruit.pixta.co.jp