スッキリわかるSQL入門」という本を読んでSQLを勉強しました。
業務でSQLを書いたことがなく、ORMを介したDBの操作も行なったこともない、フロントエンドの開発経験しかないので、バックエンドの入門としてまずSQLから理解していくことにしました。

モチベーション

  • 業務でSQLを使う際に基礎的なレベルで躓かないようにしておきたい
  • 素のSQLクエリをある程度書けるようになることで、ORMを使ってDBの操作を行うときにアンチパターンを踏まないようにしたい
  • JavaScript/TypeScriptのORMであるPrismaを理解して使えるようになりたい


SQLについて

多くのwebアプリケーションはバックエンドに永続層としてDBを持つことで、データを永続化します。
DBには、複数の表形式でデータを管理するRDBと、キーバリュー形式でデータを管理するNoSQLがあります。
RDBに対するデータの取り出し・削除・更新・追加等の操作を行うための言語がSQLです。
バックエンドのシステム(何かしらのプログラミング言語で構築されたアプリケーション)がORMを介してSQLクエリを発行し、RDBMSがそれを受け取り、データベースの操作を行うという構成が一般的ではないかと思います。

RDBMSについて

RDBMSには、商用製品として分類されるものとOSSとして分類されるものがあります。
商用製品だと、Oracle dDB, SQL Serverあたりは聞いたことあるなという感じでした。
OSSだと、MySQL, PostgreSQLあたりがフロントエンドしかやったことない自分でもよく聞くなという感じです。
RDBMSには、製品によって扱えるデータ型や関数や演算子等に違いがあるため、使うRDBMSの特徴はある程度押さえておく必要がありそうです。

SQLクエリの書き方について

  • 4大命令
  • 関数と式
  • 集計
  • 副問い合わせ
  • 結合

について章ごとに図解でわかりやすく説明されており、章末に練習問題があります。
そして、この本にはクエリを書くだけで実際にDBへの操作を実行できる環境が用意されているので、手を動かして試すことができます(自分はあまり使いませんでした)。
更に巻末にドリルと題してSQLクエリを書く問題が合計215問あり、これをやることでだいぶ定着した感覚があります。
題材として、銀行口座、商店、RPGゲームのテーブルが用意されています。
後半は副問合せと結合を合わせて使うような問題もあり、結構複雑なクエリも要求されます。

DBが永続層としての品質を担保できている仕組み

RDBMSは、複数のSQL文を意味のある単位でまとめたものをトランザクションとして扱います。
RDBMSは、トランザクションの途中で処理が中断されないようにしたり、他の処理が割り込めないようにしたりといった制御を行います。
トランザクションに含まれるすべてのSQLは、「すべての実行が完了している」か、「1つも実行されていない」のどちらかの状態を持ちます。
トランザクション内のすべてのSQL文の実行が完了したときにコミットを行うことで、変更内容を確定します。
トランザクション内のいずれかのSQL文の実行中にエラーが起こっても、RDBMSがロールバックを行うことで変更内容をなかったことにします。
これらの仕組みがあるため、たとえRDBMSを動かすサーバーに災害により電源が落ちてしまうなどの事象が起こってしまったとしても、再起動時に自動的にロールバックが行われて整合性が担保されます。

感想

この本は、「基礎的なSQLクエリがそれなりに書けるようになること」という目的にフォーカスした本です。
DB設計やパフォーマンスチューニングなどについても最低限は触れられています。ただ、実務で必要なレベルまで踏み込まれているかどうかは不明です(自分では判断ができない)。
ただ、「データが入っているテーブルを眺めながらSQLクエリを書く」という能力を伸ばすという点についてはかなりの成長が期待できそうです。自分は割と自身がつきました。
特に巻末についているドリル215問が良かったです。
また、特定のRDBMSに特化したSQLクエリの書き方については、別途理解する必要があります。
といっても、本編の内容が理解出来ていればRDBMS依存の記法に慣れるのは簡単そうです。巻末に各RDBMSの互換性についての説明もついています。
SQL初心者向けの本としては、とても良い一冊だと個人的には思います。
そして、個人的にずっと疑問だった「DBに何が起こっても整合性を保ち続けるための仕組み」について理解できたのが嬉しかったです。
SQLをある程度書けるようになったことで、バックエンドへの恐怖感が多少は薄くなった気がします。