SQLを勉強しようと思った動機
きっかけとしては、実務でSQLを扱う機会があり理解不足を痛感したためです。
同時にSQLの有用性も認識し、習得するモチベーションも湧きました。
自分がSQLを習得したいと思った理由は以下の2点です。
- RDBMSを使うシステムなら必ずSQLは出てくるため。バックエンドの言語が何であれSQLは共通。
- 10年後も使えるスキルだと思うため。
SQLパズルで勉強しようと思った理由
ミックさん著の本『達人に学ぶSQL徹底指南書』で参考書籍に挙がっていたためです。
自分のイメージとしては以下のような関係です。
- 『達人に学ぶSQL徹底指南書』 ← 教科書
- 『SQLパズル』 ← 練習問題集
学習の流れ
最初にSQLパズルを目にしたとき、難しいと感じました。そこで、なるべくスモールステップで学習できるよう心がけました。
1. SQLを動かせる環境を用意する
自分が作った環境は以下の通りです。
名前 | Version | 説明 |
---|---|---|
Ubuntu | 22.04 | OS |
PostgreSQL | 14 | RDBMS |
pgAdmin4 | 8.4 | ブラウザで動くPostgreSQLクライアントソフト |
Docker | コンテナ型仮想環境 | |
GitHub CodeSpaces | クラウドIDE |
GitHubのアカウントがあれば、どのPCでも動かせるようにGitHub CodeSpacesで構築しました。
2. 答えのSQLを写経する
- で作った環境にSQLファイルを作り、脳死で写経しました。目的はSQLに慣れることです。
この時点でやったことは以下の通りです。
- SQLの写経とそのSQLファイルを保存する
(DDLはミックさんのサポートページから拝借したことが多かったです) - エラーにならず結果が取得されることを確認する
やらなかったことは以下の通りです。
- どんなデータを取得したいのか理解すること
- SQLの意味を理解すること
(自己結合やEXISTS
述語の意味もこの時点では理解していませんでした) - 難しい問題はスルー
例: パズル3「忙しい麻酔医」、パズル12「訴訟の進行状態」
(パズル3「忙しい麻酔医」は挫折しそうになりました。「これ70番目くらいに出る問題じゃないのか…」と思ったくらいです)
3. 入力と結果のレコードをまとめて具体的な処理を調べる
処理を理解しやすくするため、入力と結果の具体的なレコードの画像をまとめました。自分の場合は紙媒体のほうが理解しやすいので印刷しました。
下の画像はFigmaで入力と結果の具体的なレコードの画像を貼り付けた図
作業内容
- 具体的なレコードを見て、取得したいデータを自分の言葉で文字化
- 『達人に学ぶSQL徹底指南書』で紹介されている問題から解く
例: 自己結合の「パズル4 入館証」、HAVING
句の「パズル21 飛行機と飛行士」「パズル20 テスト結果」など - 類題があれば、ページ数をメモ
- 答えのSQLを分解し、処理を追って確認
例:HAVING
句をコメントアウトして、GROUP BY
のみの結果を確認する
やらなかったこと
- 実行計画について考えること
SQLの速度について考える余裕はありませんでした。いつか確認します! - 別解を考えること
4. 3の内容を清書してQiitaに投稿する
3で書いた内容を清書してQiitaに投稿しました。
投稿の目的は理解の定着度を上げるためです。
感想
割と満足しています。
SQLに対する苦手意識はなくなりました。
自己結合、HAVING
句、CASE
式についてはだいぶ慣れたと思います。一方、外部結合やウィンドウ関数についてはまだ慣れていません。
今年中は勉強を続け、外部結合も使いこなせるようにしたいと思います。
参考
- 書籍
『SQLパズル 第2版』
『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ』 - 『SQLパズル 第2版』サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html - 自分のリポジトリ
https://github.com/RYA234/SQL_Puzzle_Learning