ときどき SQL の参考になる本について聞かれることがあります。
「SQL の互換性」でふれたように DB2 for IBM i はとてもきちんと標準 SQL を実装した素直な RDB ですので、「標準SQL」に準拠した SQL の本であればどれも参考になると思います。
「SQL の互換性」で見たように、SQL の実装についてはかなり各 RDB それぞれが個性的なので、たとえば「Oracle準拠」とか「MySQL準拠」などといったようなものは同等の機能(たいていの場合、あります)に読み替えるスキルがないと参考にするのは難しいでしょうね。
標準 SQL を中心にした技術書としては「プログラマのためのSQL 第2版」や「達人に学ぶ SQL徹底指南書」あたりがいろんなところで推奨されていますし、実際とても参考になります。(以前ふれたように「SQL書き方ドリル」をこちらを参照しながら見ていただくのもよいかと思います)
今回はちょっとした実験として、その「プログラマのためのSQL 第2版」に載っている SQL をランダムに選んで実行可能かどうか、試してみました。
「プログラマのためのSQL 第2版」のパッと真ん中あたりを開くと、「DR.CODD の T 結合」という難しげな章に「17.5.2 スウェーデンからの解」(P.243)として ↓ のような難しげな SQL が載っていました。
このページのちょっと前にサンプルのテーブルの作り方も書いてあったので、テスト用のライブラリー(↑ の例では SQLTEST)に作成した上で DB2 for IBM i (V5R4) で実行してみました。
(実際に STRSQL 画面から実行したものなので、ライブラリー名を補ってあるのと 5250画面にあわせてちょっとレイアウトを変えています)
SELECT C1.CLASS_NBR, C1.CLASS_SIZE, R1.ROOM_SIZE, R1.ROOM_NBR
FROM
SQLTEST/ROOMS R1, SQLTEST/CLASSES C1
WHERE C1.CLASS_SIZE =
(SELECT MAX(C2.CLASS_SIZE) FROM SQLTEST/CLASSES C2
WHERE R1.ROOM_SIZE > C2.CLASS_SIZE)
AND NOT EXISTS (SELECT * FROM SQLTEST/ROOMS R2
WHERE R2.ROOM_SIZE > C1.CLASS_SIZE
AND R2.ROOM_SIZE < R1.ROOM_SIZE)
当たり前ですが、ちゃんと実行できて、本に載っているとおりの結果が出てきました。
(本に載っているのとまったく一字一句違わない結果を得るためには、一番最後に ORDER BY C1.CLASS_NBR DESC 句が必要になります)
ちなみに「素直なSQL の書き方 - まずは FROM句から -」に載っているような「素直な」書き方(= SQL92 標準にあわせた書き方)に書き換えると ↓ のようになります。
SELECT C1.class_nbr, C1.class_size, R1.room_size, R1.room_nbr
FROM
Sqltest/Rooms R1 JOIN Sqltest/Classes C1 ON
(C1.class_size = (SELECT MAX(C2.CLASS_SIZE)
FROM Sqltest/Classes C2
WHERE R1.room_size > C2.class_size))
WHERE NOT EXISTS (SELECT * FROM Sqltest/Rooms R2
WHERE R2.room_size > C1.class_size
AND R2.room_size < R1.room_size)
もちろんこちらも問題なく実行できます。(何回かやってみましたが、最適化にかかる時間がこちらの方がテストしたシステムでは平均すると 1/3 程度になりますね)
ちなみに少し後の P.259 に DB2 ではうまくいかないケース("初期の DB2 のバージョン"と断っていますが)についての記述(「18.4.3 インラインのテキスト展開」)がありますが、ここについては少なくとも V5R4 以降の DB2 for i にはあてはまらない(つまり、何ら問題なく実行できる)のでご心配なく。
かなりフクザツそうな SQL でも「標準 SQL」であればたいてい DB2 for IBM i で実行できます。
「SQL の互換性」でもふれましたが、クセのある実装で特定のデータベースしか使えないやり方を覚えるよりは、「標準 SQL」でどんなデータベースでも通用するスキルを得た方がいいと思います。
DB2 for i はそのためにはとても適したデータベースだと言っていいでしょう。