データサイエンティストのたまご育成日記 Vol.6 - SQL研修編 -

f:id:yuzuhiko_persol:20200601103256p:plain
みなさん、こんにちは!デジタルテクノロジー統括部に新卒配属した長谷川智彦です。データサイエンティスト未経験の新卒社員がデジタルテクノロジー統括部でどんなことをやっているのか、どのように成長していくのかの学びの過程を記録していくこの企画。今回はSQLを使った分析の研修について書いていきます!


長谷川智彦のプロフィール
大学時代の専攻は植物学・分子生物学。最近趣味でデザインをかじり出した社会人1年目。植物の実験のデータを正しく解釈するために統計を勉強し始め、データ分析に興味をもつ。データサイエンスはただいま必死に勉強中。


SQL研修はじまる!

7月ももう終わりですね、今年の夏はどんな思い出を作ろうかと最近考えています。さて時は2か月ほどさかのぼり6月の頭、Pythonによるデータ分析の研修がひと段落ついたころで新しい研修に入りました。それはSQL研修!
SQLってなんぞや?って方もいらっしゃると思うので説明しますね。SQLとはリレーショナルデータベースに存在するデータを操作するための言語です。と一言で言ってもわかりづらいので、順を追って説明していきます。
皆さん、日常生活の中でいろんなサービスを利用されていますよね。その中でアプリなどに登録する際に名前や生年月日などを入力されると思うのですが、その入力されたデータは企業が持つデータベースに蓄えられています。このデータベースから欲しいデータを取ってきたり、データを加工したりするときに使用する際の指示に必要なプログラミング言語(正確にはデータベース言語)がSQLです。以下の図でなんとなくイメージを持っていただけたら幸いです。
f:id:yuzuhiko_persol:20200707113349p:plain

今回の研修ではSQLの基礎習得のため、オンラインSQL学習サービスの講座に取り組んだ後に、SQLを使用して、パーソルキャリアの持つデータベースから欲しい情報を取ってくる練習を行いました。
ただ、これから研修内容を記載しようと思ったのですが、取り扱うデータには外部に公開できないデータもあるので研修の具体的な内容は書くことができません。なので、その代わりに次の3点に関して書こうと思います。
\\ 記事の内容 //
1:オンラインSQL学習サービスと実際とのギャップ
2:初心者がSQLで欲しいデータを取り出せるようになるまでのコツ
3:SQLの勉強にお勧めなサイト・書籍
SQLを学び出した方やサービスと実際の違いを知りたい方の役に立てればと思います。

サービスでの練習と実際の違い

ここからはオンラインサービスで学習した内容と実践でSQLを使ってデータを抽出するときのギャップを書いていこうと思います。
個人的に感じた違いは以下の3点でした。

\\ サービスと実践での違い //
1:予想以上にテーブルがいっぱいあってデータが散在している(どこに欲しいデータがあるのかわかりずらかった)
2:NULL値や使えないデータが多かった
3:方言がある

それではそれぞれどうしてそう感じたのかを書いていこうと思います。
まずは1つ目の『予想以上にテーブルがいっぱいあってデータが散在している(どこに欲しいデータがあるのかわかりずらかった)』からです。
このように感じたのはシンプルにオンライン学習サービスのデータは理解がしやすいようにきれいにまとめられていたからだと思います。(考えてみたらそりゃそうだって話なのですが。)ただ、個人的にはオンラインで練習したデータが整えられているデータだったので、実戦であっても多少NULL値が多くてもある程度はきれいにそろっていると考えてました。
ところがどっこい、実際にデータベースに入っているテーブルデータを見てみると違いました、、、。欲しいデータを手に入れる際に、あるデータはテーブルAにあり、あるデータはテーブルBにあり、またまたあるデータはテーブルCにあるといった感じに複数のテーブルにデータが散らばっているほうが多かったです。
それに加え、ただ散らばっているだけならJOINを使ってつなぎ合わせたらいいのですが、実際つなごうとするとすべてのテーブルに共通の主キーがありません。このテーブルとこのテーブルは共通のキーAがあるけどこのテーブルにはない。逆にこのテーブルとこのテーブルには共通なキーBがあるけどあのテーブルにはない。といったようにJOINでつなぎ合わせるだけでもどの組み合わせでどのような順番でつなぐのかを考え続ける毎日でした。最近は段々慣れてきたのでつなぎ方もわかってきましたが、初めのうちはこのギャップに苦しみました。後程のコツのパートで書きますが、これからSQLでデータベースのデータを抽出しようと考えていらっしゃる方はクエリを書く前に、あらかじめメモにどうつなぐかの計画を書いてから取り組むことをお勧めします!

次に2つ目の『NULL値や使えないデータが多かった』に関してです。おそらくオンライン学習サービスなどの教材でSQLを学ぶと、提供されているデータはきちんとデータがそろっていて分析しやすいと思います。実際僕もそうでした。また、サービスで使用したデータセットはNULL値があったとしても少なかったです。では、実践で会社のデータベースをたたいてみたらどうだったか。感想は「NULL値多くない?」でした。もちろんデータの値がちゃんとあるカラムの方が多いのですが、カラムによってはNULL値が大半を占めるカラムも結構ありました。また、実際は入力ミスやデータの重複もちらほらとあるため、単純にGROUP BY関数でまとめても同じIDのデータが複数存在する、かつ、そのうちの数個はいらないデータが混ざってる、しかも欲しいデータを持っている行もNULL値の項目が多い。といったこともありました。(もちろん使えるデータを抽出できるように工夫します。)
このように実際はNULL値や使えないデータが往々にして混ざっているので最初は苦戦しましたが、改めてこれが普通なんだと思い、欲しいデータをちゃんととれるように数をこなしていきたいと思います!

最後に3つ目、『方言がある』に関してです。SQLにはRDBMS(リレーショナルデータベースを管理するために必要な専用ソフトウェア)共通の言語なのですが、このRDBMSにもOracle DatabaseやPostgreSQL、MySQLなどいろんな種類があり、それぞれ記述が少し違ったりします。
僕ははじめこのことを知らなかったので、サービスで学んだSQLのクエリを実行してもクエリが通らず、正しく記述しているのにどうして通らないのか悩んでいました。ただ、たまたまタイミングよく社内の勉強会でSQLには方言があると耳にしたため解決しました。SQLを始めたばっかりで、かつ、プログラミング経験も浅いとそのことを知らずに悩まれる方もいると思うのでよかったら僕の失敗を役に立ててください。


やりながら身に着けたコツ、大事な姿勢

ではここからは実際のデータベースからSQLを使って分析する際に僕が身に着けたコツや姿勢を書いていきます。(個人的な意見なので参考程度にお願いします!)

\\ SQLをたたいていくうちに身に着けたコツと姿勢 //
1:各テーブルの持つ情報とテーブル間の連携を把握する
2:先に欲しいデータの条件をノートに書きだし、データを得るためにテーブルをどのようにくっつけるかをノートに書いてみる
3:毎回少しずつクエリを書いてテーブルを確かめる(テーブルの中のデータやデータ数も確認する)
4:わからなかったらまずググる、やれること書き出しそれでも無理なら1日頭を冷やす。それでもわからなかったらそこで聞く

それでは順番に説明していきます。まずデータベースをはじめて触ったばかりだと、どのテーブルにどんなデータがあるのかそもそもわからないと思います。なので、先輩社員からテーブルに関して定義書があればもらい、よく使うテーブルに関してはどんなデータがあるかをまとめて、テーブル同士のつながりも書くことをお勧めします。
例えば下の例だと、各テーブルにはテーブルの下のような情報があることをノートに書きだします。これに加え、主キーや外部キーを押さえておき、テーブル同士がどうつながるかを整理しておくといざテーブルをJOINでつなごうとする際にどのテーブル同士がつながるのかイメージがつきやすくなります。
f:id:yuzuhiko_persol:20200707113427p:plain
次に得たいデータの条件を整理し、そのデータを含むカラムを持つテーブルをどのようにつなぐかを線でつなぎます。
f:id:yuzuhiko_persol:20200707113442p:plain
そして、個人的に大事だと思うのが一気にクエリを書いてまとめて実行しないことです。まとめて書いてしまうと、エラーが生じた際にどの段階でエラーが生じたのかを確認することに時間を奪われてしまいます。また使おうとしていたテーブルが実際は使われておらず、よくよく確認するとデータがなかったなんてこともあります。これらのことを避けるために、クエリは小さい単位で記述し、細かく実行してテーブルの中身を確認することをお勧めします。

最後に、これはコツというよりは姿勢の話なのですが、SQLを行うにしろ他のプログラミング言語でコーディングを行うにしろ、個人的には上に挙げた4つ目のことを意識しています。それは「わからなかったらまずググる、やれること書き出しそれでも無理なら1日頭を冷やす。それでもわからなかったらそこで聞く。」というものです。これ実は、僕がプログラミングを始めたときにものすごくプログラミングができる友達にコツを聞いた際に言われたことなんです。何かというと、基本プログラミングは分からないことの方が多く、頻繁にエラーコードは出るのでその都度ごとに人に聞いていたらキリがない。だから、まずは自分で検索して調べるクセをつけるのがいいということでした。初めは人に聞いたほうが安心するのと聞いたほうが早かったりするのでつい聞きたくなるのですが、それでは自分が成長しないと言われ、なるほどと思い僕も実践しています。それにプログラマーの皆さんは自身が困ったことをどう解決したのかを丁寧にまとめてくださっているので、基本的にはネットを検索すれば解決策は落ちています。ただ、ものによってはネットに解決の糸口がなかったりするので、そんな時はいったん作業を中断して1日頭を冷やしてから再度挑戦します。意外とこれでどうしたらいいかのアイデアが思いついたりするので解決します。そして、それでもどうしたらいいかわからないときはいくら考えても時間がもったいないので、ここで初めて聞いたほうがいいと友達には言われました。実際、言われた通りにして、大方のことは解決するのでこれからも大事にしようと思います。(質問する際にはどう質問したらいいかなどまとめてるサイトもあるので是非参照していただけたらと思います。)

では次にサービスで提供される講座ではあまり取り扱われないけど、実戦でよく使った文法を紹介しておきます。(サービスの方はSELECT、 FROM、 WHERE、 GROUP BYなどの絶対に知っとかなくてはいけない文法に重きを置いているものが多いのですが、これらをまず使いこなせることが大事だとは感じます。)

\\ 実際に便利だったSQL文法 //
サブクエリ:クエリの中にクエリを記述する方法。条件を段階的に絞ったりするときに便利です。簡易的に書くと以下のような文です。
(JOIN文以外の文でも使用できます。)

SELECT
   *
FROM
   tableA
INNER JOIN
   (SELECT column1, column2 FROM tableB WHERE column3 = 0) AS tableC
ON
   tableA.column1 = tableC.column1

WITH句:サブクエリは1つのクエリ内で複数回使えるのですが可読性が低くなってしまうのでWITH句を使ってまとめ、読みやすくできます。(WITH句も結局はサブクエリです。)かつ、WITH句は複数のクエリで何回も使えます。以下に擬似的なコードを示します。

WITH tableC AS (SELECT column1, column2 FROM tableB WHERE column3 = 0)
SELECT
   *
FROM
   tableA
INNER JOIN
   tableC
ON
   tableA.column1 = tableC.column1

上のサブクエリと比較するとクエリが読みやすいことが伝わると嬉しいです。

CREATE TABLE文:データベースにテーブルを作成するための文です。上記のサブクエリを濫用したクエリをはじめは書いていたのですが重くなりデータベースに負担がかかってしまうと怒られたので覚えました。以下に擬似コードを示します。

CREATE TABLE tableD (column1, column3) AS 
SELECT
   *
FROM
   tableA
INNER JOIN
   (SELECT column1, column2 FROM tableB WHERE column3 = 0) AS tableC
ON
   tableA.column1 = tableC.column1

まだまだ、僕もスラスラとは書けないのでこれらを使いこなせるようにしたいと思います。


\\ 個人的に行った勉強法 //
これから社内でも社外でもSQLが書ける人材の需要は高まると思うので、現時点で僕が行ったSQL勉強法を簡単に紹介します。以下のことを行っていました。(あくまでも一例です。)
1:ProgateのSQLコースを2周する
2:DataquestのSQL講座を順番に毎日行う
3:【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎]を読み進める
まず、始めたのがProgateのSQLコース。やはりUIが親しみやすく、ブラウザ上に環境も用意されているのでプログラミングに抵抗感がある方にはお勧めです。スライドの解説の後に問題演習となるので理解しながらサクサク学べます。また、見た目に反して中身はGROUP BYやJOIN文などしっかりとSQLの基礎構文を学べます。個人的には1回では覚えきれないので時間を空けてからもう1回行って記憶に定着させることを押します。
次に行ったのがDataquest。これは海外のサービスでデータサイエンティストになるのに必要なPythonや機械学習、SQLの講座を学べます。特徴としては海外のサービスなのですべて英語で書かれているのとUdemyのように映像を見てからの演習ではなく、ひたすら出されたテキストの演習問題をコードを書いて解くことが挙げられます。僕自身現在も行っていますが、難しい反面ものすごい勢いでコード力とPythonやSQLの知識がつきます。(月額のサブスクリプション料金が発生するので注意。)DataquestのSQL講座では上記に挙げたWITH句やサブクエリなどもガンガン扱うので実力たたき上げたい方には個人的にお勧めです。ただ、人によって頭に入りやすい教材は違うので映像で学ぶ方が好きな方はUdemyのSQL講座など自分に合ったオンラインサービスを見つけていただけたらなと思います。
最後に、現在【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎]を読み進めています。これはORACLE社が行っている資格試験用のテキストなのですが、きれいに各構文の使い方がまとまっているので辞書としてお勧めです。(もちろん書籍もいろいろあるのでご自身にあったものを辞書として選んでいただけたらと思います。)

総括

今回は会社にあるデータベースを使いながらSQLで欲しいデータを抽出する練習を行いました。(先輩が問題集を用意してくださっていたのでその問題集に取り組んだ形です。)全体を通しての感想としては
・実際は複数のテーブルをつなぎ合わせないといけないので、各テーブルの理解とどのようにつなげるのかをクエリを書く前に考えることが大事。
・もう少しいらないデータを処理できないのかと感じた。
・WITH句、CREATE TABLE文などが使えるようになり引き出しが増えた。
・プログラミングにおける方言を初めて認識した。
・自分でSQLを使って、欲しいデータをデータベースから取り出すのが意外と楽しかった。
・何回もやり直しを受けたがこの1か月でだいぶSQLに慣れた。
といったことを感じました。これから本番でどんどんSQLをたたくと思うので自在に取り出せるように頑張ります!
では今回の内容はここまでです。次回のデータサイエンティスト育成日記もお楽しみに!


alt


長谷川 智彦 Tomohiko Hasegawa

デジタルテクノロジー統括部 データ&テクノロジー ソリューション部 アナリティクスグループ

※2020年6月現在の情報です。

▶パーソルキャリアの求人ページはこちらから