2010年9月10日(金) 09:24 JST

HOME > i am BEST > SQL はRPG/400 の究極のかたち?!

SQL はRPG/400 の究極のかたち?!

  • 2009年4月20日(月) 02:18 JST
  • 投稿者:
    hidehi

データベースを使う上での基本 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 X

WITH 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 を積極的に使ってみてください!!

トラックバック

このエントリのトラックバックURL:
http://www.iforum.ne.jp/trackback.php/20090420021819212
表示形式
コメント投稿

コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。

  • SQL の発想
  • 投稿者:hidehi on 2009年4月30日(木) 12:27 JST

以前「DB2 for IBM i の知名度 (DB2 for i の認知度)」という記事のコメントで紹介した、
ミックさんという方の「リレーショナル・データベースの世界」というサイトの「そんなあなたが大好きよ(SQL礼賛)」という記事がとても参考になりますので、ぜひ読んでみてください。

今回の記事は、まとめると ↓ のようなことでもあるんですね。

「ユーザが SELECT 文を書くとき、記述されるのは、欲しい結果の内容です。結果をいかにして得るかという「手続き(procedure)」は記述されません。つまり、SQL は手続き型言語ではないのです。手続きを考えるのは DBMS の仕事であって、ユーザが気にすることではない、というのが関係モデルの基本理念の一つだからです。だから、何回ループさせて、どこで条件分岐させて、といった具体的な手続きは、SQL の中には一切現れません。」

iForumサポーター

      iFourmの趣旨にご賛同いただき、ご支援いただける企業または個人を募集しています。詳しくは、info@iforum.ne.jp へお願いします。