「データベースを使う上での基本 2つ」で、"自然な SQL を書くこと"を"基本"のひとつとして挙げましたが、
今回はその自然な SQLを書く上での「SQL の発想」といったようなことを考えてみたいと思います。
データベースとは、行(レコード)の集合を処理するものですね。
RPG でプログラムを書くときでも、要するにレコードの取捨選択/集計がその処理内容です。
これ、プログラムを書く前に要件があるわけで、それはせんじつめればデータの取捨選択/集計の条件となるわけです。
「条件を指定するだけでプログラムができてこないかなぁ」と思ったこと、ありませんか?
実はそれが SQL なんです。
その「条件」はどんなものかよく考えてみると、
どういうファイル(テーブル)から、
どういう条件のレコード(行)を選択/集計し、
得られたレコード(行)のうちどのフィールド(カラム)を表示する、
ということですよね。
それが SQL では
どういうファイル(テーブル)から → FROM
どういう条件のレコード(行)を選択/集計し → WHERE
得られたレコード(行)のうちどのフィールド(カラム)を表示する
→ SELECT
と対応しているわけです。
こう考えると、やはり FROM の指定から書き始めるのが"自然"な順番なわけです。
RPG の F仕様書なんです。
実際には、FROM で指定できるのはファイル(テーブル)だけではありません。(最初の頃の SQL はそうでしたが)
SQL92 から"データの集合"が指定できるようになっています。
テーブルとテーブルを同じキーを仲立ちとして結合したものや、
極端な場合、SELECT 文を名前をつけて指定できるようにもなっています。
いくつか例を挙げてみましょうか。
FROM の指定が、テーブル1つだけ、というシンプルなものの例です。
SELECT C1, C2, C3, FLG
FROM T1
WHERE C2 <= 20,000 AND FLG != '1'
2つ以上のテーブルの場合は、↓のようにいろんな書き方ができます。
(すべて同じ結果が得られます)
SELECT A.C1, A.C2, B.C3, A.FLG
FROM (T1 A LEFT OUTER JOIN T2 B ON A.C1 = B.C1)
WHERE A.C2 <= 20,000 AND A.FLG < > '1'SELECT *
FROM
(SELECT A.C1, A.C2, B.C3
FROM (T1 A LEFT OUTER JOIN T2 B ON A.C1 = B.C1)
WHERE A.C2 <= 20,000 AND A.FLG < > '1'
) AS XWITH Y AS
(SELECT A.C1, A.C2, B.C3
FROM (T1 A LEFT OUTER JOIN T2 B ON A.C1 = B.C1)
WHERE A.C2 <= 20,000 AND A.FLG < > '1'
)
SELECT * FROM Y
FROM で得たいデータの検索元となる"データの集合"は、テーブル(ファイル)でも、ビューでも、↑ の例のような SELECT 文に AS X や WITH Y などで名前をつけたものでも、そのどれでもOK です。
その検索元となる"データの集合"をまず指定し、
さらに WHERE で条件を設定すると、結果として行(レコード)の集合が決まってきますので、
さらに SELECT で必要なカラム(フィールド)を指定する、という構造に SQL はなっている、というわけです。
WHERE での条件の設定は感覚的にそれほど難しいものではないでしょう。
こちらは RPG で言えば C仕様書ということになります。
↑ の例にあるように、「フラグがオンのものを除いて」「フィールドの値が 20,000 以上のもの」を「全て」処理する、というようにまず考えますよね?!
それをそのまま指定すればいいんです。
昔ながら(AS/400やそれこそS/38)の人であれば、Query/400 での指定の仕方とほとんど同じです。
どうでしょう?
RPG でデータベース処理のやり方に慣れていることは全然無駄にはなりません。
要件をまとめる考え方のスキルはそのまま生かせるわけです。
もちろん、Query が使えていたんだったら、もう全然問題ありません。ちょっとの慣れが必要なだけです。
コツは、「フローチャートで考えるのではなく、ほしいデータの条件だけを考えてみる」ということですね。
(ただ、もともとの要件は「ほしいデータの条件」なんですよね。実はそれを「手続き」に展開していたわけです)
対話型SQL ですぐに結果を確認することができるのも便利です。
(今までだって Query で結果の確認とかしていませんでしたか??)
STRSQL 画面からでも System i ナビゲーターからでも、SQL に対して F4(プロンプト)キーが使って、テーブルやカラムの設定を行えるので、それこそ Query みたいなかんじで SQL が実行できるのも DB2 for IBM i ならでは、です。
そうして実行し、結果を確認済した SQL をそのままプログラムに埋め込めばいい、というわけですね。
しかもそのSQL、つまりデータベース処理ロジックは RPG にも JDBC にも使えます。
くりかえしになってしまいますが、
- FROM でデータの検索元となる集合を指定し、
- WHERE で条件を設定し、
- SELECT で表示カラムを指定する、
というのが、SQL のごく"自然な発想"の仕方です。
そんな"発想"をちょっと頭の片隅にでもおいて、ぜひ SQL を積極的に使ってみてください!!
この記事にはトラックバック・コメントがありません。
コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。
以前「DB2 for IBM i の知名度 (DB2 for i の認知度)」という記事のコメントで紹介した、
ミックさんという方の「リレーショナル・データベースの世界」というサイトの「そんなあなたが大好きよ(SQL礼賛)」という記事がとても参考になりますので、ぜひ読んでみてください。
今回の記事は、まとめると ↓ のようなことでもあるんですね。
「ユーザが SELECT 文を書くとき、記述されるのは、欲しい結果の内容です。結果をいかにして得るかという「手続き(procedure)」は記述されません。つまり、SQL は手続き型言語ではないのです。手続きを考えるのは DBMS の仕事であって、ユーザが気にすることではない、というのが関係モデルの基本理念の一つだからです。だから、何回ループさせて、どこで条件分岐させて、といった具体的な手続きは、SQL の中には一切現れません。」