SQLは文法からやっちゃダメ
SQLができる人はたくさんいます。しかし、ほとんどの人は文法から勉強し、文法と実経験からSQLのスキルをつけていったのじゃないかと思う。
同じくオブジェクト指向言語などの手続き型言語も、文法から覚えた人がほとんどじゃないかな。
私の知る限り、手続き型言語 → SQL の順で文法から勉強する人が多く、文法から考えると、手続き型言語とSQLでは、余りにコンセプトが違うため、染みついたイメージを乗り越えられない。
結果
SQLは難しい
SQLは変な言語
SQLは大ッキライ
SQLなんて必要ない……
それを乗り越えて、文法からSQLを身につけた人は大したものだな〜。って思う。
私は極めてひねくれ者なので、入門書を読んでも、リファレンスを読んでも、勝手にイメージに置き換えていただけなのですが、現状は9割ぐらいの人が文法を頼りに習得していると思うのだけれど……。
LEFT JOINの間違いとか、INとEXISTSの取り間違いとかを普通にする人は、開発経験が長いベテランでもいくらでもいます。少しソースを見れば文法から入っているのは明らかです。
しかし、まぁ、ある程度はちゃんと動くシステムを組んでいる。
じゃあ、いいじゃないかというとそうでもない。文法から考えている人は、やはり壁はいっぱいあって、イロイロとぶつかるし、巨大システムでアジャイルなんてあり得ないと思う感覚も出るだろう。
繰り返すけれど、文法の違いを乗り越えて、文法からSQLのスキルを身に付けていった人は、もう、ものすごい努力をしているのは間違いないけれど、それに見合うリターンはない。
イメージが大事
私自身が考えるときは、テーブルが全部エクセルシートになっていて、頭の中のこびとに指示して答えが出るところまで処理させる。その指示した内容をSQLに置き換えるような書き方をしている。これでは他人には説明しようがないので、ベン図とか、カラオケとか、手続き型言語のイメージとか、いろんなものを持ち出して説明しようとしているけれど、一番重要なイメージは「SQLは仕様書である」ということじゃないかな。
手続き型言語ができるなら、言語のイメージから考えてもいいかも知れない。
何となく逆の感じもしないでもないけれど、イメージを持ってSQLを書いて欲しいのです。
SQLに違和感があるなら、手続き型言語の処理イメージで
SQLに違和感があるなら、自分が得意な手続き型言語の処理イメージで考えれば良いでしょう。
5万曲が入ったカラオケで、余興で歌いたい曲が5曲あるとすると。
手続き型でいうと以下の様な処理になるでしょう。
foreach (int 番号 in 歌うリスト)
{
結果セット.add(カラオケ.find(番号));
}
それが、
foreach (song 曲 in カラオケ)
{
if(Arrays.binarySearch(歌うリスト, 曲.番号))
{
結果セット.add(曲);
}
}
というプログラムが出てきたら……。
つまり、5万回ループして、毎回5件の配列とマッチングし、ヒットしたら結果セットに返すって、結果は正しいけれど、新人なら笑って指導ですね。しかし、ベテランが書いたら普通は許せないと思う(私の感覚がおかしいのかな?)。
SQLで言えばINとEXISTSが取り違えになりますが、手続き型では、少なくともベテランがそんなミスをすることはないけれど、SQLでは日常茶飯事です。そんな状況をなんとかしたいと思っています。
何にせよ、一番重要なのは、SQLは仕様書であってプログラムではないというイメージが最も重要なのです。