序文
私の仕事は、DBエンジニアです。といっても別に望んでデータベースの世界へきたわけではなく、当初、私はこの分野が面白くありませんでした。「Web系は花形、データベースは日陰」という言葉も囁かれていました。今でも囁かれているかもしれません。
ですが、しばらくデータベースを触っているうちに、私はこの世界にとても興味深いテーマが多くあることを知りました。なぜもっと早く気づかなかったのか、後悔することしきりです。 もちろん、自分の不明が最大の原因ですが、この世界に足を踏み入れた当時、先生も、導きの書となる入門書もなかったことも事実です。 今でこそバイブルと仰ぐ『プログラマのためのSQL 第2版』も新入社員には敷居が高すぎました (2015年2月追記:その後、自分で第4版を訳出できたのだから、 人生は何があるか分からないものです)。
そこで、です。このサイトの目的は、データベースの世界に足を踏み入れた当時の自分に向かって、多少は見通しを持つことのできた現在の私が、データベース入門のてほどきを行うことです。 当時「こんなサイトがあれば」と感じた、そういうサイトを作ることです。
以下の条件に当てはまる人を読者に想定しています。
- なぜ"関係"モデルという抽象的な用語を使うのか分からない。"表"モデルでいいじゃない。
- なぜ「= NULL」ではなく「IS NULL」と書かねばならないのか分からない。
- E.F.Codd、C.J.Date、J.Celko の本を読んだことがない。
- IN述語とEXISTS述語では、IN の方が直観的に分かりやすいから好きだ。
- IN述語、EXISTS述語、LIKE述語・・・「述語」って何だ?
- テーブル設計のときは滅多に NOT NULL制約を付けない。しかもそれが大罪であることの自覚がない。
- SQLで分岐とループを表現する方法を知りたい。
- SQLでCASE式を使ったことがない。
- SQLで自己結合を使ったことがない。
- HAVING句を影の薄い脇役だと思っている。
- GROUP BYとPARTITION BYの違いを一言で説明できない。
- SQLで木構造のデータを扱いたい
パフォーマンス・チューニング
- 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 のテクニックから離れて、テーブル設計の話。それもあまり行儀のよくない一癖ある連中ばかり集めてみました。
- ビューの功罪
ビューは諸刃の剣です。ご利用は計画的に。
- SQLプログラミング作法
大したことではないのですが、SQL にもマナーはあった方がいいでしょう。
- 手続き型から宣言型・集合指向に頭を切り替えるための7か条
SQL を学ぶときに一番の障壁となるのが、手続き型言語から無意識のうちに身に付けた考え方です。手続き型言語から SQL へ、うまくジャンプするためのコツをまとめました。
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 が概観した連載の要約です。
ちなみにこの連載、好評だったのか本にもなってます。
- 国家・データベース・イノベーション
リレーショナル・データベースの歴史を見ると、関係モデルというアイデアが破壊的技術であり、その誕生史はそのままイノベーションのジレンマを地で行く展開だったことが分かります。
- 【決定版】RDBMSとNoSQLにみるDB近現代史
エンジニアHUBに掲載された記事。RDBからNoSQLまでの歴史を概観しています。
NULLにまつわる諸問題
- 3値論理――神のいない論理
3値論理という奇妙な体系にまつわるトピックを紹介します。なぜ「= NULL」ではなく「IS NULL」と書かなくてはならないのか分からない人へ向けて書きました。
- 3値論理とNULL
CodeZine用に具体例をかなり増やしました。
- SQLにおける論理演算
あまり NULL 絡みの話はしておらず、どちらかというと論理演算の便利さを紹介したのですが、まあ分類で言うとやはりこの位置かな。
- NULL撲滅委員会
万国のDBエンジニア団結せよ。
- 存在と無
NULL と空集合の違いって分かります?
- 130値論理
身の毛もよだつ多値論理の話。こえー。
その他
- 『SQLの達人』はいかにして生まれたか?―ミックさん
2018年に翔泳社のEnterpriseZine誌で行われたインタビュー。自分とSQLとの関わりはじめなどを振り返っています。
- 「エンジニアは初見の敵にやられてはいけない」
『SQL ゼロからはじめるデータベース操作 第2版』の刊行に際して行われたインタビュー。非構造データの重要性が増してくるという予測は、データレイクという言葉が出てきた今から振り返ると先見性の明があったのではないでしょうか(自画自賛)。
- 神は細部に宿る(图灵访谈)
『SQL ゼロからはじめるデータベース操作 第2版』の中国語版刊行時の出版社によるインタビュー。
- 『SQLパズル 第2版』サポートページ
拙訳 J.セルコ『SQLパズル 第2版』(翔泳社, 2007)のサポートページ。現在8刷。セルコの本が日本のSQLプログラマに親しまれるのは良いことです。
- 『SQL徹底指南書』サポートページ
拙著『達人に学ぶ SQL徹底指南書』(翔泳社, 2008)のサポートページ。皆様に愛されて10刷になりました。
- 「みんなまとめて面倒みよう」 (PDF)
2008年2月13日にデブサミで行った講演の資料。『指南書』発売に合わせたプロモーションということで、書籍の宣伝も兼ねて RDB と SQL について話しました。
- 「リレーショナルとはどんなことか」 (PDF)
2010年5月28日の Club DB2 第103回で行った講演の資料。破壊的技術としての RDB 、集合指向と手続き型の対比について。
- 「達人が語るこんなデータベース設計はヤダ!」 (PDF)
2012年7月13日の Club DB2 第146回で行った講演の資料。データベース設計の落とし穴やその背景にある理由などについて。
- 「ループをめぐる物語」 (PDF)
2015年5月15日の Club DB2 第200回で行った講演の資料。『SQL実践入門』出版記念もかねて、ウィンドウ関数を利用したレコードの順序を意識したコーディングのメリットについて。
- 「RDBパフォーマンス設計大全」 (PDF)
Database Lounge Tokyo #5 (2017.09.19)で行った講演の資料。パフォーマンス設計における考え方と注意点を中心に議論しました。
- 「SQL実践入門Night」 (PDF)
SQL実践入門Night (2018.01.25)で行った講演の資料。『SQL実践入門』のメインテーマである手続き型の復権について話しました。
- 推薦図書