そうこれも良くある勘違い。SQL ServerはInsertされた順に行を返すことが多いが、それはたまたま。Oracleも多分たまたまだし、MySqlもたぶんたまたま。
ORDER BYしなければ行順が特定できないのと同様に、SQL標準では以下のようなクエリをテーブルやビューにかけた場合、その結果セット各行の列順も保証していない。
SELECT * FROM hoge
これで結果セットの各行にスキーマ定義された順序でフィールドが並んでデータが返ってきそうだが、SQL標準ではそれは保証されていない。列順を期待通りに得たいなら、以下のようにちゃんと自分でクエリー文に列順を記述すること。
SELECT alpha, brabo, chary, romeo FROM hoge
行順にしても列順にしてもこういった「カンチガイ」をしないためには、RDBMSのテーブルが「表」だと意識しないことだ。
普段RDBMSのテーブルにあるデータは以下のように表型のデータがあると意識していると思う。
実際もこのようにデータがRDBMSに格納されているかもしれない。ただ、このイメージのままでいると、先入観として、特にしてしなくても行順と、列順が維持されたデータが返ってくると思ってしまう。表の中から行が切り出されたみたいに。
そうでは無く、クエリー文を書くときには下図のように各レコードも、その中のフィールドもばらばらにある集合、各データが粒として袋に詰まっているようなイメージとしてデータがテーブルに保存されているイメージを思い浮かべてみる。
こういうイメージを持っておけば、自ずから自分で、列順を指定し、行順を指定(特定)しなければ、自分にとっての意味のあるデータにならないと考えるようになる。
まずは、データは行に決まった列順・行順に格納されているという先入観を無くしてみよう。そうすれば正しく思い通りの結果が返ってくる。動けば良いのでは無く、正しく動くようにクエリを書こう。
コメント