SQLのクエリ文で気をつけたいこと

DO’s&DONT’s #13: 絶対にやってはいけないこと – ORDER BY が指定されていないクエリの結果が一定の順番に並んでいると仮定すること – Microsoft SQL Server Japan Support Team Blog – Site Home – MSDN Blogs.

そうこれも良くある勘違い。SQL ServerはInsertされた順に行を返すことが多いが、それはたまたま。Oracleも多分たまたまだし、MySqlもたぶんたまたま。

ORDER BYしなければ行順が特定できないのと同様に、SQL標準では以下のようなクエリをテーブルやビューにかけた場合、その結果セット各行の列順も保証していない。

SELECT * FROM hoge

これで結果セットの各行にスキーマ定義された順序でフィールドが並んでデータが返ってきそうだが、SQL標準ではそれは保証されていない。列順を期待通りに得たいなら、以下のようにちゃんと自分でクエリー文に列順を記述すること。

SELECT alpha, brabo, chary, romeo FROM hoge

行順にしても列順にしてもこういった「カンチガイ」をしないためには、RDBMSのテーブルが「表」だと意識しないことだ。

普段RDBMSのテーブルにあるデータは以下のように表型のデータがあると意識していると思う。

実際もこのようにデータがRDBMSに格納されているかもしれない。ただ、このイメージのままでいると、先入観として、特にしてしなくても行順と、列順が維持されたデータが返ってくると思ってしまう。表の中から行が切り出されたみたいに。

そうでは無く、クエリー文を書くときには下図のように各レコードも、その中のフィールドもばらばらにある集合、各データが粒として袋に詰まっているようなイメージとしてデータがテーブルに保存されているイメージを思い浮かべてみる。

こういうイメージを持っておけば、自ずから自分で、列順を指定し、行順を指定(特定)しなければ、自分にとっての意味のあるデータにならないと考えるようになる。

まずは、データは行に決まった列順・行順に格納されているという先入観を無くしてみよう。そうすれば正しく思い通りの結果が返ってくる。動けば良いのでは無く、正しく動くようにクエリを書こう。

コメントを残す