Jの衝動書き日記

さらりーまんSEの日記でございます。

第2回 SQLはプログラミングにあらず

今日のポイントは、SQLはプログラミングにあらず。問い合わせなりである。

1.SQLとは何か?

SQLを書くのは正直苦手だった。データベースを操作するのに、何故にわざわざ別のプログラミングを書かねばならないのか。覚えたプログラミングの中に、何やら異物が混入したようで気持ち悪かったし、型を合わせたりするのがめんどくさい。何より、何だかプログラミング言語らしくない。そんなわけでデータベースを操作するのは、もっぱらO-Rマッパーに任せてしまっていた。これなら、プログラミング言語の操作とそう変わらない。SQLが出てくるたびにギクリとしたものだった。

このようにSQLプログラミング言語という認識でいたのだが、それが誤りだとSQLを学ぶうちにわかってきた。

ではSQLとは何か? それは、データベースに対する問い合わせなのである。問い合わせとプログラミングは明確に異なる。

問い合わせとは、要するに何かを要求することである。SQLの場合は、データベースに対して必要な集合を要求したり(SELECT)、データを指定して修正要求を出したりする。求めているのは結果だけであり、その取得方法をいちいち示したりはしない(取得対象の集合や取得条件などを指定するが、これも要求の中に含まれる)。こんな感じでお願いします〜とデータベースに要求書を出すのがSQLなのである。

これに対してプログラミングとは、実行した結果、求める結果を得ることを目的としているが、そのためにはその処理プロセス(どのデータをどこから取得し、どう加工して出力するのかという手順のあつまり)も示さなくてはいけない。要するに、求める結果を得るための必要な事項をすべて指示しないといけないのだ。問い合わせとプログラミングは決定的に異なるのである。SQLプログラミング言語だと認識していたのが、そもそも気持ち悪さの元だったのだ。

2.SQL組み立てのポイント

SQL=問い合わせという認識を持った結果、組み立て方法もずいぶんわかるようになってきた。今はO-RマッパーでSQLを組むぐらいだったら、自分で組んだ方がやりやすい。それにテーブル=オブジェクトという定義も何だか面倒になってきた。これは、SELECTが扱うのは、テーブルではなく、集合だということに気づいたことが大きい。

SQLを組み立てる上で重要なことは何か? それは、どうデータを取ってくるか?ではなく、どんなデータを自分が欲しているのか?ということをまず示すことである。ようするに、必要としている集合をまず初めに定義することが大事なのである。SELECTの場合は、まずはSelect-Listの中に何をおくべきか?を考えるということだ。どの集合(テーブル)から値を取ってくるのか?はその後に考える。要求事項をまずは確定することが大事なのだ。要求事項が確定した後は、それに対して取得元の集合の条件などを考える。そうすれば、SQLは意外と簡単に組み立てられる。

  1. Select-Listを確定
  2. From-ListとWhere句を確定

の順序が大事なのである。まあ、Select-Listの中身は面倒なので*で済ますことは多いが、それでも要求事項を確定することが重要だ。

データベースパフォーマンスアップの教科書では、SQLに関して面白いたとえが載っていた。それは、SQLを発行するということは、発行する側:教師、データベース;生徒であり、教師が生徒に対して宿題を出すようなものということだ。教師は生徒に宿題を出すとき、当然生徒が解ける問題を出す。そのため、問題を解くための条件や問題を解く対象を指定する。しかし、その解法は示さない。答えを解くのは生徒の役割だからである。

そのため、生徒は、教師が意図しない、非効率な方法で問題を解くことがある。そうならないように、教師は必要に応じて解法のヒントを生徒に与える。より良い解法に導くのだ。これがデータベースのチューニングというわけだ。あくまでもヒントを提示するだけであり、解くのは生徒=データベースである、という点がポイントである。

SQLを学ぶ場合、プログラミング言語を学ぶというより、データベースから目的の情報を引き出すための会話方法を学ぶというのが正しい表現なのだ。

参考文献

  • データベースパフォーマンスアップの教科書