ホーム


リレーショナル・データベースの世界


 私の仕事は、DBエンジニアです。といっても、別に望んでデータベースの世界へ来たわけではなく、辞令によって、入社 1 年目の私は Oracle と向かいあうことになりました。当初、私はデータベースが面白くありませんでした。「ネットワークは花形、データベースは日陰」という言葉も囁かれていました。今でも囁かれているかもしれません。

 ですが、しばらくデータベースを触っているうちに、私はこの世界にとても興味深いテーマが多くあることを知りました。なぜもっと早く気づかなかったのか、後悔することしきりです。もちろん、自分の不明が最大の原因ですが、この世界に足を踏み入れた当時、先生も、導きの書となる入門書もなかったことも事実です。今でこそバイブルと仰ぐ『プログラマのためのSQL 第2版』も新入社員には敷居が高すぎました。

 そこで、です。このサイトの目的は、データベースの世界に足を踏み入れた当時の自分に向かって、多少は見通しを持つことのできた現在の私が、データベース入門のてほどきを行うことです。当時「こんなサイトがあれば」と感じた、そういうサイトを作ることです。

 以下の条件に当てはまる人を読者に想定しています。




パフォーマンス・チューニング

SQLを速くするぞ
 なるべくベンダー非依存の技術を集めました。同じ結果を得る SQL でも書き方次第でかなりのパフォーマンス向上が望めるものです。

治療としてのパフォーマンスチューニング
 「パフォーマンスチューニング」という仕事がどのようなフローにしたがって実施されるかを、医師の「治療」に見立てて解説しました。実際、私は仕事でチューニングをするとき、自分が「ヒーラー」であるように錯覚する。医者とエンジニアの仕事には意外に共通点が多いのです。社会的地位はずいぶん違うケド。

実践向け


CASE式のススメ
 便利なのに意外に使われていないCASE式を、もっと活用しましょう。レイアウトの見やすい CodeZine 版はこちら → 前編 後編

自己結合の使い方
 CASE式に劣らず強力だけど、動作がイメージしづらくてあまり利用されていない自己結合についての解説。「集合指向言語としてのSQL:その1」

HAVING句の力
 「集合指向言語としてのSQL:その2」です。影の薄い脇役と思われがちなHAVING句の復権のために。いい出来だと思う。

外部結合の使い方
 結合シリーズ第2弾。さあ、みんなで結合しよう。

SQLでループ! 相関サブクエリの使い方
 初心者が必ずつまづく相関サブクエリについて、基礎から解説しました。相関サブクエリも集合の「カット」という操作なのだ、という点を理解してくれれば、マスターしたも同然。

相関サブクエリで行と行を比較する
 「集合指向言語としてのSQL:その3」。これもなかなか。「自己結合の使い方」と併せ読むと面白いかも。

SQLで数列を扱う
 「数列」というのは、あくまで順序集合の一番分かりやすい例として出したものなので、方法論自体は一般性の高いものです。なにげに量化の話まで入れてしまった欲張りな回。

SQLで連番を扱う
 初出は『Web+DB Press』Vol.45。「連番」というのも、SQL ではなかなか素直に扱えない対象です。しかし、近年では ROW_NUMBER、RANK など手続き型の考え方で操作できる関数が追加されるようになったため、かなりとっつきやすくなっています。

SQLで集合演算
 UNION、INTERSECT、EXCEPTなどを中心に、SQLでの集合演算の利用方法を解説した記事です。「集合指向言語としてのSQL:その4」

帰ってきたHAVING句
 ジュワッ! 「HAVING句の力」第2弾です。これは HAVING と GROUP BY の解説としては決定版といって差し支えないでしょう。類別と特性関数の話も出せて満足な一品。

更新なんてこわくない!
 SQL というと、どうしても検索に主眼が置かれますが、実は最近は更新の手段もかなり充実しており、DB 内部でさまざまなデータ編集をすることが可能になっています。

スカラ・サブクエリの使い方
 スカラ値と複合値というのは、「第1正規形とは何か」という関係モデルの基礎に関わる重要な区分です。それを理解すると SQL の中でのスカラ値の使い方が分かります。

OLAP関数で強力な統計処理を実現!
 『Web+DB Press』で2年間連載していた「SQLアタマアカデミー」の最終回。SQL:2003で標準に入った OLAP 関数(ウィンドウ関数、分析関数)について、基礎から応用まで一通り理解できるよう解説しています。

SQLアタマ養成講座 (PDF) (HTML)
 初出は『Web+DB Press』Vol.44。SQLの重要な三機能:分岐(CASE式)、ループ(相関サブクエリ、OLAP関数)、カット(GROUP BY、PARTITION BY)の使い方を解説したもの。「中級入門」の対象者を意識して書きました。

SQLで木と階層構造のデータを扱う(1)――入れ子集合モデル
 近年、データベースの世界で要望の高まりを見せている木構造の扱い方を、「入れ子集合モデル」という独創的な方法に基づいて解説します。このモデルは、初めて知るときはけっこう感動します。
 『Web+DB Press』版はこちら

SQLで木と階層構造のデータを扱う(2)――経路列挙モデル
 木構造の扱い方第2弾です。今度は、ノードをディレクトリに見立てて、文字列操作を駆使します。ファイルシステムの発想とも共通点の多い興味深い方法論です。

SQLで木と階層構造のデータを扱う(3)――入れ子区間モデル
 入れ子集合モデルには、整数を座標に使っているため、更新時のパフォーマンスが悪いという欠点がありました。それを克服するため、整数から有理数へ一般化したモデル。これも初めて知るときには震えがきます。

SQLで数学パズルを解く (数論編) (組み合わせ論編)
 どうせ SQL を学ぶなら、楽しみながら学べた方が嬉しいもの。問題、解法も随時受付中。

SQL For Practitioners
 知っていると時々便利な Tricks & Tips。随時更新の予定です。



設計・その他


テーブル設計のグレーゾーン
 SQL のテクニックから離れて、テーブル設計の話。それもあまり行儀のよくない一癖ある連中ばかり集めてみました。

ビューの功罪
 ビューは諸刃の剣です。ご利用は計画的に。

SQLプログラミング作法
 大したことではないのですが、SQL にもマナーはあった方がいいでしょう。

手続き型から宣言型・集合指向に頭を切り替えるための7か条
 SQL を学ぶときに一番の障壁となるのが、手続き型言語から無意識のうちに身に付けた考え方です。手続き型言語から SQL へ、うまくジャンプするためのコツをまとめました。



SQL緊急救命室

 『Web+DB Press』(Vol.62〜)に連載中の「SQL緊急救命室」が順次オンラインで公開されます。
第1回 サブクエリ・パラノイア〜副問い合わせ乱用による性能劣化を治療せよ!
第2回 冗長性症候群〜条件分岐をUNIONで表現するなかれ
第3回 ループ依存症〜手続き型の呪縛を打ち破れ!
第4回 スーパーソルジャー病〜すべての問題をやみくもにコーディングで解くべからず
第5回 時代錯誤症候群〜進化し続けるSQLに取り残されるな!
最終回 更新時合併症〜冗長なサブクエリ,性能劣化,実装依存



アーキテクチャ


記憶装置のトレードオフとバッファの考え方
 「DBアタマアカデミー」第1回。どんな DBMS でも必ず持っている「バッファ」というメモリ領域の背後にある仕組みと思想についての解説。

トランザクションを知ればデータベースがわかる
 分かっているようでなかなか深く理解しないままになりがちな概念「トランザクション」について。同時実行制御、WAL、スラッシング、ACID など。

性能改善の鍵,インデックスの特性を知る
 データベースのインデックスでよく使われるアルゴリズム B-tree(B+tree) および ハッシュの原理についての解説。なかなかよくまとめられた、と自賛の一品です。

バックアップとリカバリ
 運用設計で外すことのできないバックアップ/リカバリについて。実際のところリカバリの手順というのは一本道なので、主にバリエーションの多いバックアップについて解説しています。

クエリ評価エンジンと実行計画
 リレーショナル・データベースのパフォーマンスを決定する SQL の実行計画、およびそれを立案するクエリ評価エンジンの動作について。



基礎理論


なぜ"関係"モデルという名前なの?
 なぜ「表モデル」という名前ではないのか?その疑問に答えるための小文。関係の正確な定義を知りたい人向け。

アドレス、この巨大な怪物
 関係モデルはなぜ考え出されたのか。それはアドレスという怪物からデータベースを解放するためのアイデアでした。
 この文章の後半、プログラミング言語一般に議論を広げた部分は、大雑把過ぎるので読み流してください。いずれ修正します。

SQLの中の述語論理
 IN述語、EXISTS述語、LIKE述語 ・・・・・・ 述語って何だ? それは関数 ―― 正確には述語論理の基礎概念である「命題関数」 ―― のことです。データベースの世界から見た述語論理入門。

そんなあなたが大好きよ
 いやあ、SQL って本当に、いいもんですね。

GROUP BYとPARTITION BY
 普段なにげなく使っているGROUP BYとPARTITION BY。本当はどういう機能を果たしているか、分かりますか? SQL の背後にある集合論と群論の考え方を解説します。

再帰集合とSQL
 ランキングや累計を求めるクエリでは、ノイマン型の再帰集合が重要な役割を果たします。そのアイデアの源泉は、自然数の帰納的定義という集合論の基礎にまで遡ります。その理論的背景を探るコラム。


歴史
リレーショナル・データベースの歴史 (1)  (2)  (3)
 リレーショナル・データベースが誕生してから30年の歴史を、データベース界の指導的論客である C.J.Date が概観した連載の要約です。
 ちなみにこの連載、好評だったのかにもなってます。

国家・データベース・イノベーション
 リレーショナル・データベースの歴史を見ると、関係モデルというアイデアが破壊的技術であり、その誕生史はそのままイノベーションのジレンマを地で行く展開だったことが分かります。


NULLにまつわる諸問題

3値論理――神のいない論理
 3値論理という奇妙な体系にまつわるトピックを紹介します。なぜ「= NULL」ではなく「IS NULL」と書かなくてはならないのか分からない人へ向けて書きました。

3値論理とNULL
 CodeZine用に具体例をかなり増やしました。説明も昔に比べてうまくなった気がする。

SQLにおける論理演算
 あまり NULL 絡みの話はしておらず、どちらかというと論理演算の便利さを紹介したのですが、まあ分類で言うとやはりこの位置かな。 

NULL撲滅委員会
 万国のDBエンジニア団結せよ。

存在と無
 NULL と空集合の違いって分かります?

130値論理
 身の毛もよだつ多値論理の話。こえー。


その他

『SQLパズル 第2版』サポートページ
 拙訳 J.セルコ『SQLパズル 第2版』(翔泳社, 2007)のサポートページ。現在 3 刷。セルコの本が日本の SQL プログラマに親しまれるのは良いことです。

『SQL徹底指南書』サポートページ
 拙著『達人に学ぶ SQL徹底指南書』(翔泳社, 2008)のサポートページ。皆様に愛されて 6 刷になりました。

『SQL ゼロからはじめるデータベース操作』サポートページ
 拙著『SQL ゼロからはじめるデータベース操作』(翔泳社, 2010)のサポートページ。現在第1章まで対応。第2章以降も現在準備中です。

「SQLアタマアカデミー」サポートページ
 『Web+DB Press』(Vol.44〜55)に掲載の「SQLアタマアカデミー」のサポートページ。

「DBアタマアカデミー」サポートページ
 『Web+DB Press』(Vol.56〜61)に掲載の「DBアタマアカデミー」のサポートページ。

「みんなまとめて面倒みよう〜真のDBエンジニアになるために必要なこと〜」 (PDF)
 2008年2月13日にデブサミで行った講演の資料。『指南書』発売に合わせたプロモーションということで、書籍の宣伝も兼ねて RDB と SQL について話しました。

「リレーショナルとはどんなことか」 (PDF)
 2010年5月28日の Club DB2 第103回で行った講演の資料。破壊的技術としての RDB 、集合指向と手続き型の対比について。

「達人が語るこんなデータベース設計はヤダ!」 (PDF) New!
 2012年7月13日の Club DB2 第146回で行った講演の資料。データベース設計の落とし穴やその背景にある理由などについて。

セルコ・セレクション
 データベース界の偉大な導師J.セルコの記事の要約。

推薦図書
ホームへ戻る
b_entry.gif b_entry.gif Tweet