ソフトウェア技術者としての自分の弱点のひとつに「SQL の読み書きが遅い」というものがある。僕は長らく「RDBMS の ACID 特性には価値があるけど、SQL はいまいち表現力が低くて書き心地の悪いものである」と考えていた。さらに言えば「ACID なデータストアを扱うための何らかの DSL が、将来的に SQL を置き換えるだろう」とすら考えていた。
この予想は大外れであった。現代では RDBMS ではないデータストアさえ SQL (もしくは SQL ライクな) インタフェースを備えるようになり、SQL を自在に使いこなせないと日々の仕事に差し障るようになった。つまり、SQL を自在に扱うことのできない僕は、仕事に支障が出るようになってしまったのだ。これはまずい…。
そこで SQL を読み書きする訓練のため、参考書を探すことにした。SQL 関連書籍のレビューを読み漁ると、ミックさんの本の評判がとても良い。最初の一歩として、彼の書籍の中でも「初級」とラベリングされている『SQL 第2版 ゼロからはじめるデータベース操作』を読むことにした。
これは実際のところ、かなり易しく書かれた本である。それでも僕程度の SQL 力だと学べることも多くあった。具体的には CASE 式やウィンドウ関数の読み書きは不得意であったが、それらの機能についても馴染むようになった。「馴染む」と言えば、この本は各章に練習問題がついている点が素晴らしく、読んだ内容を手に馴染ませられるような作りになっている。
また、MySQL, Oracle, SQL Server, DB2, PostgreSQL を対象として書かれている一方で、それらが標準 SQL に準拠していない場合はその旨の記述がある点も素晴らしい。おかげで MySQL での練習もスムーズに行うことができた。ちなみに、この本では「ウィンドウ関数は MySQL では使えない」という記述があるが、MySQL 8.0 以降ではサポートが追加されている。これは余談になるけど、前回の「使い捨て可能な MySQL の実験環境」という記事は、この本の練習問題をこなすための環境構築時に書いたものである。
ところで、練習問題の想定解は書籍のサポートページに掲載されている。 しかし、このページで提供されているファイルは SJIS でエンコードされており、UTF-8 環境では文字化けに悩まされることになる。僕は次のシェルスクリプトで UTF-8 に変換した上で、もろもろの操作を行った。
#!/bin/bash
find . -type f -name '*.sql' | while read -r file
do
echo "$file"
iconv -c -f sjis -t utf-8 "$file" | tr -d '\r' > tmpfile
mv tmpfile "$file"
done
exit