はじめに
アドベントカレンダー初参加です🥳
今年(2025)は本格的にデータエンジニアとしてのキャリアを歩み始めた年でした。
そこで、これまでよちよちSQLだった私がちょっと脱せたかな?と思える学習をまとめてみます。
この記事のターゲット層
・SQL書けるようになりたいけどよく分からないよって方
・簡単なテーブル定義とか検索クエリは書けても、ちょっと複雑な要件があると自力では難しい方
・SQLをすらすら書けるようになりたい方、もっと力試ししたい方!
話すこと
・SQL(特にDQL・クエリ)の文法学習におすすめの教材
・それらを実際にやってみた感想
私の現在地
これまではアプリケーションエンジニアを数年しておりました。
よってテーブル作成やデータ挿入/更新/削除+簡単な検索などは実装してきました。
ですが、EDA・分析に必要な以下のような高度なクエリを書くことはほぼありませんでした。
・GROUP BY + HAVING を用いた多軸集計
・CASE WHEN による条件分岐
・ウィンドウ関数を使ったランキングや時系列比較
→これらを習得したい!というのが本記事のテーマです。
やったこと①:文法の理解
まず、どんなクエリの書き方ができるのか、文法の全体像を把握しました。
以下のUdemyの講座が非常に良かったです。
以下の章立てで包括的に学べます。
- 基本構文:DISTINCT, WHERE, ORDER BY, BETWEEN, IN, LIKE, 比較演算子, ...
- 集約:GROUP BY, HAVING, ウィンドウ関数(ランキング, LAG), ...
- 結合:各種JOIN, 自己結合, UNION, ...
- その他の処理:日時系, 文字列系, 数値系, サブクエリ
- DDL/DML
- 条件式/プロシージャ:CASE WHEN, COALESCE, CAST, NULLIF, VIEW, WITH
(私のメモベースですので、若干異なっていたらスミマセン)
この中で「なんだっけこれ...?」と思う項目があれば、やって損はないと思います。
PostgreSQLのローカル環境構築から始まり、途中演習もちょこちょこあるので、実際に手を動かしながら学習することができます。合計で1週間もあれば完了できると思います✨
やったこと②:簡単な実践
主にクエリ(DQL)の文法を一通り理解したので、簡単な実践をしていきます。
おそらくかなり有名ですが、SQLBoltです。
練習問題だけでなく文法の説明も付いているので、復習感覚で読みながら問題を解きました。リアルタイムで正誤の結果が反映されるので、準備することもなくストレスフリーなのが良かったです。解答は公式には用意されていなさそうでしたが、先人の方々のありがたいQiita記事やチャッピー君に頼ればOKです(笑)ただかなり基本的な問題で、頭を悩ますこともあまりなかったので、効率重視の方は飛ばしてもいいと思います。2,3時間あれば完了できます。
やったこと③:本格的な実践
いよいよ脱初心者に向けた演習をしていきます。LeetCodeのSQL50です。
その名の通り50問の演習をひたすら解いていくもので、文法の知識は既にある前提です。クエリ記述→Runして結果確認→Submitで提出という流れで、Submitした後はEditorialの解説を見ることができます(一部有料だったりそもそもないものもありますが...)難易度は一応Easy / Medium / Hardで分かれてますが、Easyでもかなり頭を悩ます問題がある一方で、Mediumでもそこまで難しくないものもありました。正直、難易度表記はあまり参考にならないかもしれません(笑)ただ全体的に骨のある問題が多いので、これまでの文法の知識を実務で使えるレベルにしていくのに最適だと思いました。
また、以下の点が特に興味深かったです。
①他の人のクエリが見られる
Submitした後は実行時間ごとの分布を見ることができ、青いバーをクリックすると他の人がどんなクエリを書いたのか見ることができます。全く違う書き方で自分より処理が速かったり、同じような書き方でも可読性が良かったりと、いろいろ勉強になったので良い機能だなと思いました✨
②全てのテストケースを通って初めてAccepted
Runはテストケースを1つしか通さないので、正解だと思ったクエリもSubmitするとNGになるケースがありました。ソートなど問題文の細かい要件を読み飛ばしていたり、そもそも想定が甘かったりと自身の至らなさを痛感するばかり...改めてテスト工程の大切さを感じるとともに、ただ書けるだけでなく実務でも通用する観点を感じられました。
まとめ
これら3つの学習を1ヶ月ちょっとで実施しました。基礎の基礎しか知らなかった自分が少しSQLに自信を持てるようになったかな?と思います。今はチャッピー君はじめAIが普及している世の中ですので、物凄く高度なクエリを何も見ずすらすら書ける、というレベルまでは要らないのかもしれません。ですが、文法を一通り知っておりそれをすぐにアウトプットできることは実務においてまだまだ重要であると思います(いちいちチャッピー君に聞くのも非効率ですし...)シンプルに頭の体操になって楽しいので、定期的に取り組んでみようと思います💪
おまけ
・SQL50の実行時間分布に気を取られすぎない
オンラインの演習ということもあり、扱うデータは物凄く少量です。なので実行タイミングによって同じクエリでも実行時間が大きく変わることがありました。他の人はどんなの書いたのかな〜と覗く程度がいいと思います。また、実務など格段に大きな量のデータを扱う場面ではクエリ性能に対して考える尺度が異なると思います。脳死で結合ばかりしているとI/O増加でメモリ使用量増大しますし、サブクエリで頑張ろうとしても最適化されず処理遅くなるかもです。扱うDBの特性やデータの質と量を鑑みて様々なクエリ方法を試すことができる、そのために大事な脱初心者である、と心得た次第です...!
・縛りを設けるのも面白そう
様々なクエリを書けることの裏返しで、サブクエリだけで全て解く、といった縛りも面白そうだと思いました。将棋でいう飛車角落ちです。そこまでできれば上級者の仲間入り??
