こんにちは!赤津と申します。
この記事では、WebディレクターでSQL初心者の私が実際に挑戦してつまづいた点や感じたことなどをまとめたいと思います。
<目次>
- SQLに挑戦した理由
- SQL学習に役立つリソース
- つまづきポイント
SQLに挑戦した理由
データベースからSQLを用いて情報を抽出・分析するという作業は、幅広い分野で日常的に行われていると思います。
私自身、WEBディレクターとしてこれまで感覚的な判断が多かったと感じる一方で、意思決定や企画立案をデータドリブンに行う重要性が高まっていると実感しています。
そうしたデータドリブンな判断力を高めるための第一歩として、分析業務の基本スキルを身につけることが必要だと考え、業界・職種を問わず使えるSQLの学習に挑戦しました。
SQL学習に役立つリソース
実際に私が学習に使用したツールを紹介します。
主に以下3つを活用して、次の流れで進めました。
【100本ノックで自分なりに書いてみる(メインで使用) → ChatGPTで解説・疑問点解消 → SQL道場で理解度チェック】
1. データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
実際の業務で遭遇するデータ処理の課題を想定されており、実践的なスキルの習得に役立つ教材です。
データベースはPostgreSQLです。
SQLの他にPython、Rもあり全3言語が学べます。
2. SQL道場
https://sql-dojo.com/
実際にSQLを書いて練習できるサイトで、難易度別に構成されているので初心者でも始めやすいです。
データベースはDuckDB-wasmです。
3.ChatGPT
https://chatgpt.com/
疑問が生じた際に都度細かく解説してもらいました。
構文に関してはもちろん、分析に関する知識などSQLを学ぶ上で知っておくとよいことも質問することで理解がより早く深くできたと思います。
リアルタイムで疑問を解決できるため、家庭教師のような心強さがあります。
つまづきポイント
私はSQLの知識もなく、全く触ったことがない状態で学び始めたため、特に以下のポイントでつまづきました。
※今回私が学習に使用したデータベースはPostgreSQLです。
1. 何から勉強すればよいかわからない
SQL学習サイトの存在は知っていたものの、どこから手をつければいいのか分からず、まずは基礎を調べることから始めました。
SQLには大きく分けて【DDL(データ定義言語)】【DML(データ操作言語)】【DCL(データ制御言語)】【TCL(トランザクション制御言語)】の4つがあります。
このうち、DMLに分類されるSELECT文から学ぶことがベターで、学習ツールもこのSELECT
から始まるものが多いとわかりました。
そこからはツール使用をメインにシフトし、効率的に進めることができたと思っています。
2. エラーメッセージに戸惑う
最初は構文エラーが出ても、何が悪いのか全く分からず戸惑いました。
しかし、エラー文は「どこが間違っているか」を教えてくれる手がかりであることを理解してからは、少しずつ原因を読み解けるようになり、落ち着いて対処できるようになりましたし、エラー文を学びの一環として捉えられるようになりました。
3. 「AND」と「,(カンマ)」の使い分け
ANDは複数の条件を組み合わせたいときに、カンマは複数の列を並べたいときに使います。
当初はこの違いを理解できておらず、WHERE
句で条件をカンマで区切ってしまい、構文エラーに悩まされました。
目的を考えれば簡単ですが、書き方を理解していないうちは初歩的なことでもつまづきました。
▼誤
SELECT *
FROM receipt
WHERE store_cd = 'S001' , amount >= 1000; --★ここが誤り
▼正
SELECT *
FROM receipt
WHERE store_cd = 'S001' AND amount >= 1000;
4. 「=」と「LIKE」の使い分け
=は完全一致、LIKEは部分一致に使います。
特にワイルドカード(%や_)を使いたい場合はLIKEが必須です。目的を意識せず何でも=を使ってしまっていたことで、意図しない結果が返ってきました。
【ミスの例】
「顧客データ(customer)で、住所(address)が東京都内の会員だけを抽出して表示」
▼誤
SELECT *
FROM customer
WHERE address = '東京都%'; --★ここが誤り
→住所が「東京都%」の会員しか抽出できない
▼正
SELECT *
FROM customer
WHERE address LIKE '東京都%';
→ワイルドカードを使用しているので「東京都港区~」「東京都新宿区~」などがヒットする
5. NULLに混乱する
書き方が合っているはずなのに結果が想定と違う という場合、NULLが原因だったことが何度もありました。
空文字は「値は存在するがその値が空である」状態なので=で比較できますが、NULLは「値が存在しない」状態です。
そのため、「=」での比較はできず「IS」を使う必要があります。
特に厄介なのは、「= NULL」としてもエラーは出ずに「該当なし」になる点です。これがミスに気づきにくくミスを繰り返してしまう原因になっていました。
【ミスの例】
「顧客データ(customer)で、メールアドレス(email)が登録されてない会員だけを抽出して表示」
▼誤
SELECT *
FROM customer
WHERE email = NULL; --★ここが誤り
▼正
SELECT *
FROM customer
WHERE email IS NULL;
6. DML(SELECT文)は書き順と処理順が違う
どうしてこれが間違っているのか?という壁に何度もぶつかりました。その多くが処理順と書き順が違うことについての理解が浅いことが原因でした。
例えば、WHERE は集計前の条件指定、 HAVING は集計後の絞り込みに使用しますが、WHEREに集計関数を使ってしまう、集計前にデータを絞りたいのに HAVING を使ってしまうなどエラーを出してしまっていました。
この違いを理解することで自分でミスを直せるようになったり、ミス自体が減ったり、SQLの理解が進んだと感じます。
【書き順と処理順の違い】
書き順 | 処理順 |
---|---|
① SELECT | ③ FROM |
② 集計関数 | ④ JOIN |
③ FROM | ⑤ WHERE |
④ JOIN | ⑥ GROUP BY |
⑤ WHERE | ② 集計関数 |
⑥ GROUP BY | ⑦ HAVING |
⑦ HAVING | ① SELECT |
⑧ ORDER BY | ⑧ ORDER BY |
⑨ LIMIT | ⑨ LIMIT |
【ミスの例】
「レシート明細データ(receipt)に対して、店舗コード(store_cd)ごとに売上金額(amount)の平均を計算し、その平均が 3,000円以上の店舗だけを抽出して表示」
▼誤
SELECT store_cd, AVG(amount)
FROM receipt
WHERE AVG(amount) >= 3000 --★ここが誤り
GROUP BY store_cd;
→WHEREに集計関数を使っているためエラーになる
▼正
SELECT store_cd, AVG(amount)
FROM receipt
GROUP BY store_cd
HAVING AVG(amount) >= 3000;
→集計後に絞り込む時はHAVINGに書く
おわりに
最初はつまづくことも多く、「こんなことも分からないのか」と落ち込むこともありましたが、目的を意識しながらエラーを読み解いていくうちに、少しずつ理解が深まりました。
最初から100点を目指さず、60~70点を目指して少しずつ慣れていけば、想像していたよりもSQLのハードルは高くないと感じました。
普段ディレクション業務をしている私にとっては、自分でデータの抽出や分析ができるようになることで、仮説検証やKPI設計の際にこれまでデータチームに丸投げになっていた部分も自分で対応できる範囲が広がり、スピード感ある意思決定につながると考えています。
また、SQLや分析の知識が身についたことで、データチームやエンジニアとのやり取りにおける伝達ミスや認識のズレも減り、コミュニケーションの質も高められると感じています。
SQLに興味がある方やこれから挑戦する方は、ぜひ気負わずに一歩を踏み出してみてください!