はじめに

ミックさんのデータベース学習ロードマップの5冊目となる『達人に学SQL徹底指南書 第2版 初級者で終わりたくないあなたへ』を読了しました。

書籍情報内容
書籍名達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
著者名ミック
出版年2018年10月11日
ISBN9784798157825
書籍ページhttps://www.shoeisha.co.jp/book/detail/9784798157825

ざっくり感想

『SQL緊急救命室 ─⁠─非効率なコードを改善せよ!』に続き、CASE式やウィンドウ関数を用いた効率的なSQLの記法についても学ぶことができました。 さらに、自己結合やHAVING句、EXISTS述語、外部結合、パフォーマンスチューニングなど、中級者として必要な細かい・複雑な部分についても詳しく解説されています。 また、実務的な内容だけでなく、集合演算や数列の扱いなど理論的・学術的な部分にも触れられており、非常に充実した内容でした。

学んだことのメモ

CASE式とウィンドウ関数の重要性

SQLの中級者になるためには、CASE式とウィンドウ関数の理解と活用が必須です。これらの機能を適切に使用することで、SQLの記述量を削減し、コードの可読性も向上させることができます。

例えば、CASE式は複数のUNIONを使用するような複雑な条件分岐を、より簡潔に表現することができます。また、ウィンドウ関数は、従来であれば相関サブクエリや自己結合を使用していたような集計処理を、より直感的に記述することが可能です。

さらに、これらの機能はパフォーマンスの面でも有利なことが多いです。多くのデータベースエンジンで最適化されており、実装に依存しない標準的な機能として提供されているため、積極的に活用していきたい機能です。

EXISTS述語の活用

EXISTS述語は、SQLにおける存在量化を表現するための重要な手段です。これは集合を入力として取り、その集合の存在を確認するという意味で、高階関数的な性質を持っています。

SQLでは全称量化(JavaScriptでいうeveryのような機能)を直接表現する構文が提供されていないため、NOT EXISTSを使用して「…ではないものの一覧」という形で書き換える必要があります。一方、存在量化は標準的な構文として提供されており、より直感的に使用できます。

また、EXISTS述語は直感的なIN句と比べて、パフォーマンス面でも優れていることが多いです。これは、結合キーでインデックスが効く可能性が高く、また短絡評価的な性質を持つため、最後まで評価する必要がない場合があるためです。

NULLとの付き合い方

SQLにおけるNULLの扱いは、三値論理という独特の理論に基づいており、直感に反する挙動を示すことがあります。NOT NULL制約を設定しただけでは不十分な場合が多く、特に外部結合やGROUP BY ROLLUP・CUBEなどの操作では、NULLが常に出現する可能性があります。

このような状況に対処するためには、以下のような具体的な方法があります:

  1. 未登録状態を表すコードを用意する
    • 例:「01: 男性、02: 女性、09: 未知、00: 不明」のように、明確なコード体系を設計する
  2. 文字列型の場合は「不明」などの特殊な文字列を使用する
  3. 数値型の場合は、0や-1などの特殊値を用いて未設定状態を表現する

NoSQLとRDBの関係性

リレーショナルデータベース(RDB)は、データベース技術における破壊的イノベーションでした。一方、NoSQLは当初「Not SQL」としてRDBを代替する位置付けになりうると見られていましたが、現在では「Not Only SQL」という位置づけに変化し、RDBと補完的な関係性を確立しています。

RDBの本質的な特徴

RDBの重要な特徴の一つは、物理的なデータの格納位置(ポインタ)を抽象化し、論理的なデータアクセスを提供している点です。これにより、アプリケーション開発者は物理的なデータの格納方法を気にすることなく、論理的なデータ操作に集中することができます。

RDBの理論的基盤

RDBは、単なる実用的な技術ではなく、確固たる数学的・論理学的な理論的基盤を持っています。具体的には:

  • 述語理論:データの整合性や制約を表現する基盤
  • 集合理論:データの関係性や操作を定義する基盤
  • 圏論:データの変換や操作の性質を理解するための基盤

これらの理論的基盤により、RDBは単なるデータ格納技術を超えた、信頼性の高いデータ管理システムとして機能しています。

最後に

実務に直結するようなSQLの書き方の話もあれば、より深みのある理解へ辿り着くためのポイントも示されていたり、非常に満足のいく一冊でした。 そろそろ論理設計のところに入っていきたいなと思っています。