DBMSで標準のソートルールは結論からいえば「デタラメ」です。特に決まったルールはなくRDBMSによってその標準のソートルールは変わります。なので、きっちりソートしたい場合は「ORDER BY」を使う必要があります。
ORDER BY句は、SELECT文をソートできる機能ですが、細かい挙動についてまとめておきます。
「ORDER BY句」の記述ルール
必ず、SELECT文の最後に記述する。
「ORDER BY句」の暗黙のソートルール
1 2 3 4 |
SELECT NAME,PRICE,COUNT FROM ITEM WHERE PRICE > 1000 ORDER BY NAME ASC,PRICE DESC; |
- ASC、DESCキーワードを未指定にした場合は、「ASC」(昇順)で動作する。
- 複数のソート条件はカンマ区切りで指定します。(また、個別に昇順、降順を指定できます。)
- NULLを含むソートをした場合は、NULLは先頭か末尾に行く。(RDBMSによってどちらに行くかは異なる。)
- 「SELECT句で指定した別名」が、「ORDER BY句」では使うことができる。
- WHERE句やGROUP BY句と同時に使えます。
SQLでの、SELECT句の評価順番としては、「ORDER BY句」よりも前になるので、ORDER BY句では、SELECT句で指定した別名を使用することができます。
(なお、「GROUP BY句」は、SELECT句よりも前に評価されるので、SELECT句の別名が使えませんでした。)
「列番号」を使ったソートは使うべきか?
「列番号」は、SELECT句で指定した列名を左から採番した番号のことですが、下記の理由から積極的に使うべきではありません。
列番号の例
1 2 3 |
SELECT NAME,PRICE,COUNT FROM ITEM ORDER BY 1,2; --1が「NAME」を指し、2が「PRICE」を指す。 |
- 「1」や「2」という数字が何を示しているのかがわからず、コードがぱっと見分かりにくいため。
- 列番号は、標準SQLにて、「将来削除されるべき機能」として定義されました。
上記の理由から判断して、使うべきではないでしょう。
ソートはSQL的にコストの高い処理
元々RDBMSの設計思想である本来のリレーショナルモデルの考え方ではソートという概念はありません。
なので、そもそもORDER BYという操作自体がかなりSQL的にコストの高い処理になります。さまざまな考え方や設計手法があるので把握しておきましょう。
詳しくは下記の記事でも解説しています。
この記事へのコメントはありません。