達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ を読みました

この本を読みました。

目次

まず目次から。2部構成になっていて、第1部は主に演習をしながら進めていくタイプの内容で、第2部は主に読み物としてリレーショナルデータベースの世界を覗くものになります。

1部 魔法のSQL

  • 1 CASE式のススメ
  • 2 必ずわかるウィンドウ関数
  • 3 自己結合の使い方
  • 4 3値論理とNULL
  • 5 EXISTS述語の使い方
  • 6 HAVING句の力
  • 7 ウィンドウ関数で行間比較を行なう
  • 8 外部結合の使い方
  • 9 SQLで集合演算
  • 10 SQLで数列を扱う
  • 11 SQLを速くするぞ
  • 12 SQLプログラミング作法

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

  • 13 RDB近現代史
  • 14 なぜ”関係”モデルという名前なの?
  • 15 関係に始まり関係に終わる
  • 16 アドレス、この巨大な怪物
  • 17 順序をめぐる冒険
  • 18 GROUP BY と PARTITION BY
  • 19 手続き型から宣言型・集合指向へ頭を切り替える7箇条
  • 20 神のいない論理
  • 21 SQLの再帰集合
  • 22 NULL撲滅委員会
  • 23 SQLにおける存在の階層

自分のレベルと書籍のレベル

自分のレベル

書籍の「はじめに」の項に以下の分があります。

本書 の コンセプト は「 中級 SQL プログラミング 入門」 です。

私自身は恐らく中級者というのにも疑問が着くレベル。

SQL文は普通に使います。少なくとも2日に1回は使うくらい普段使い。

ただ複雑なSQLは、場当たり的に調べて使っているくらい。例えば1章にあるCASE文や、2章にあるウィンドウ関数は調べた結果使うことはあっても、ゼロから何も見ないで普段使いすることは無い程度。

パフォーマンスチューニングの経験数はそれなりにありますが、元々あるSQLをExplain見ながら、インデックスやDBMSの特性とマシンリソースといった物理設計を考えながらTry&Errorでチューニングしているだけ。

ゼロから大きなSQLを書く経験は殆ど無いです。

書籍のレベル

1部の最初が、いきなりCASE文から始まるところが、入門書では無いことを良く表しています。少しCASE文について書かれている1章から引用するとからこのような感じです。

CASE 式 を 使いこなせる か どう かが、 SQL の 初級 者 と 中級 者 の 違い と 言っ ても 過言 では あり ませ ん。

とか、

WHERE 句 で 条件 分岐 さ せる のは 素人 の やる こと。 プロ は SELECT 句 で 分岐 さ せる

とか、

HAVING 句 で 条件 分岐 さ せる のは 素人 の やる こと。 プロ は SELECT 句 で 分岐 さ せる

とか。

雰囲気わかりますでしょうか。

上に書いたように1章は実際に手を動かすタイプの内容です。バックグラウンドの理論の説明を挟みながら進めることができるので、恐らく中級者には足りていない私のレベルでも、1章の内容はしっかり使えるようになりました。たぶん進めるにあたり他の書籍は、ほとんど必要無いくらいに丁寧に書かれていると思います。


2部は理論の話になってきます。

ところで 本書 には もう 1 つ、 想定 する 読者層 が あり ます。 こちら は レベル に よら ず、「 SQL とは 何 なのか」 を 知り たい と 思っ て いる 方々 を 対象 と し て い ます。

「はじめに」に上記の文がありますが、本当にSQLとはなんぞやという話です。

なか には「 自分 の 使っ て いる 道具 の 成り立ち を 知り たい」 と 思う 人 も いる でしょ う。 本書 は、 その よう な 好奇心 を 持っ て しまっ た 読者 に対して、 SQL の 原理 と なっ て いる 仕組み や、 この 言語 を 作っ た 人々 が 何 を 考え て 現在 の よう な 形 に し た のか、 という バックグラウンド を 掘り起こし て 伝える こと を 目指し て い ます。

これは完全に自分に当てはまります。趣味としてこういうバックグラウンドが好きです。

個人的には以下がとても楽しく読めました。

  • 13 RDB近現代史
  • 18 GROUP BY と PARTITION BY
  • 19 手続き型から宣言型・集合指向へ頭を切り替える7箇条
  • 22 NULL撲滅委員会

ただ、正直に白状すると歴史などの内容の記述を含めても、自信を持って理解できたと言えるのは6割くらいです。内容はわかりやすく、読んでるうちは着いていけないというのは無いのですが、ちゃんとした理解にはもう少し修練が必要そう。頑張れば理解できると思う(と信じている)ので、もう少し勉強して再チャレンジしたいです。

サンプル・演習の実行環境準備

表紙にある以下の文言の通り、1部は手を動かしてみて進めることで確実に身につくものがあると思います。

  • 200を超す豊富なサンプルコード
  • 25問の練習問題

ということで、実行環境はとても重要。実行環境の作り方を簡単に書いておきます。事前準備はDockerだけ動けばOKです。

実行環境

書籍の動作環境を見ると以下の3環境でサンプルコードが動くようです。

  • Oracle Database 12cR2
  • PostgreSQL 10.3
  • MySQL 8.0.2

環境準備、まずはパッケージインストールして・・とならないのが最近の良いところで、Dockerでコマンド叩くだけです。

SQL叩くだけなのでalpineで十分ということで、公式コンテナ覗いて 10.3-alpine があったのでこれ使います。

コンテナ起動

postgresが動くコンテナをバックグラウンドで起動します。

# PostgreSQL 10.3のコンテナの起動
$ docker run -d --rm --name sql_practice  postgres:10.3-alpine

pgcliで接続

入力補完効くpgcliが便利です。

https://www.pgcli.com/

$ docker run -it --rm --link sql_practice:postgres pygmy/pgcli
Server: PostgreSQL 10.3
Version: 2.0.2
Chat: https://gitter.im/dbcli/pgcli
Mail: https://groups.google.com/forum/#!forum/pgcli
Home: http://pgcli.com
postgres@172:postgres>

こんな感じで入力補完でサクサク進められるはずです。

https://raw.githubusercontent.com/dbcli/pgcli/v2.0.2/screenshots/pgcli.gif

psqlで接続

普通のpsql使いたければ。

# psqlで接続
$ docker run -it --rm --link sql_practice:postgres postgres:10.3-alpine psql -h postgres -U postgres
psql (10.3)
Type "help" for help.

postgres=#

コンテナ削除

作業終わったら以下でPostgreSQLのサーバーを片付けるだけです。

$ docker rm -f sql_practice

SQLファイルダウンロード

こちらのサポートページから書籍内で利用するSQLファイルを落としてきて実行します。 注意ってほどでも無いのですが、サンプルファイルは Shift JIS です。

そして、演習用のファイル code_3-A.txt だけUTF-8です。

とりあえず、UTF-8に変換しておきます。

$ for f in $(ls -1 code_1*);do echo $f; iconv -f sjis -t utf8 $f > $f.sql;rm $f;done

あとは、上の手順で動いているpgcliやpsqlでSQL叩いてみれば動くと思います。これで書籍を読み進める準備が整いました。

所感

すぐに使える内容もいっぱい

またまた冒頭「はじめに」にから引用します。

実際 多く の エンジニア や プログラマ は、 SQL に対して ぶつぶつ 文句 を いい ながら も、「 深く 絡む と 面倒 な やつ だ が 適当 に 距離 を 保っ て いれ ば そこそこ 便利 な 仕事 上 の 知り合い」 くらいの 付き合い 方 を し ます。

正に自分です。必要な時に、取得する情報に向けて調べながらSQLを書いたり、問題となっているSQLのチューニングをしたりということは良くあったのですが、SQLをSQLとして学んだことは無かったというのが正直なところでした。

そんなでもある程度使えてしまうのがSQLの良いところなのかもしれませんが、

1部のCASE文、ウィンドウ関数、量化子EXISTSあたりを勉強できただけでも、大きく自分のSQLの可能性が広がりました。既に本書の内容を普段使いできています。

読みやすい

まず単純に、文体が口語で、かつ冗長ではないので、日本語としてとても読みやすいです。

また、全体を通じて複数の書き方が説明されていて、こちらはあるDBMSでは動かない、こっちは動く・・この書き方のメリットは・・みたいに書かれているので、複数の書き方を知った上で、バックグラウンドを理解した上で正しい書き方を提示してくれているので納得感が高いです。

こういった本の内容を写経をしながら進めて行く場合、理解のために、写経したコードを少し変えてみて実行してみるという方法があると思います。そしてその際に疑問に思ったことを別途調べて・・のような。この本の場合は想定QAが直後についている時があって、写経して出てきてた疑問、知りたかったことがそこで回答されていることが何度もありました。

2部の理論難しい

ここは私の理解力の低さが原因かもしれないので、個人的意見として取ってください。 とてもわかりやすく書いていただいていると思うのですが、理解できていると自信を持って言えないくらいの理解度・・

ただ、それでもSQLの面白さが少しわかった気がします。

1部を全て手を動かしてからの、この内容。

  • 19 手続き型から宣言型・集合指向へ頭を切り替える7箇条

すぐに手続き脳になってSQLでどう書けばよいかわからなかった問題も、今だとある程度は書けるようになっています。この章の内容は1部の内容に合わせて、何度も読み直したいです。

そして、理論の部分もまた勉強して後ほどリベンジしたいです。

2021/11/24 所感追記

ゼロから大きなSQLを書く経験は殆ど無いです。

2年前の記事を読むと↑のように書いています。そんな私もデータ分析用の巨大SQLを書く必要に何度も迫られました。BigQueryだったりRedshiftやAthenaだったり。ローカルのPandas等に落としてくるには大きすぎるデータを分散基盤を使って集計しようとすると、この本に記載のあるCASE句からWindow関数まで無くてはならない道具です。

改めて勉強しておいて良かったなと思いました。