こんな方にオススメ:SQL/RDBの使用経験が1年以上のプログラマ/SE。
- ひととおりのクエリは書いたり読んだりできるけれども、結合・サブクエリはコピペがメイン
- パフォーマンスが悪いとお手上げ
- データ分析にWindow関数を使いたくてマニュアルを読んだけど、ちんぷんかんぷん
このレベルの人が受講すると、すごく役立つと思います。
一人一台のノートパソコンにOracle Databaseの実行環境が用意され、演習も実際のデータを用いてできるため、SQL*Plusの簡単な操作さえ行えれば、実際に手を動かして、確認しながらセミナーを聞き進めていくことができます。
午前の部:SQLで自在にデータ操作を行う
まずは実習で使う環境の確認です。私自身は通常はMySQLを使っており、Oracle DBのCLIであるSQL*Plusをまじめに使っていたのは、もう20年ほど前なのですが(笑)、すでに手元のノートパソコンでOracle DBインスタンスが起動済み、動作の確認もほぼコピペで行えるので、特に行きづまることなく準備OKでした。
さて、午前の部では、SQLで自在にデータ操作を行う、ということで、JavaやC#など、いわゆる「手続き型言語」では学習の初期に教わる、条件分岐(IF文、CASE文)とループ(FOR文、WHILE文)についてです。これらは手続き型では不可欠なものですが、SQLを勉強する際には「教わりません」。しかし、この2つを使いこなせるようになると、SQLプログラミングの幅が大きく広がるということで。最初は「条件分岐に当たるもの」の解説です。
条件分岐:CASE式
SQL標準の初期(SQL-92)で定められたCASE式は、今やすべてのRDBMSで利用できます。文ではなく式というのがポイントで、クエリの「式」が書けるところには、どこでも書けます。次のような「一番簡単なCASE式のサンプル」からはじめ、徐々に現場で役立つところまで演習を重ねていきます。
SELECT CASE WHEN 1 = 1 THEN '1=1です' ELSE NULL END AS case_col FROM DUAL;
ループ:相関サブクエリに替わるもの?
ループといえば、私などは真っ先に「相関サブクエリ」を思い出すのですが(注1)、モダンなRDBMSではWindow関数でループを扱えるとのこと。Window関数といえば「順位に使えるRANKだけを知っていて、その他はぼんやりとしか分からない。まぁMySQLではそもそも使えないし、いいか」というくらいの温度感だったのですが、ミックさんの「ウィンドウというのは範囲という意味で、GROUP BYのグループに似ているが、集約しないので、GROUP BYのカットの機能だけを残したもの」という説明で、がぜん興味がわいてきました。
実際、その言葉を元に演習を重ねると、これまでぼんやりとしていたWindow関数の輪郭が徐々にはっきりしてきた気がしましたし、新機能をいろいろ理由付けして未着手にする自分を少し反省しました。
注1
そもそもSQLでループさせる方法がわからずに、アプリケーション側でループを記述してその中でSQLを実行する人もいますが。