【sql】チートシート【ソート編】
昇順・降順
-- 省略したときは昇順
ORDER BY COL1
-- 昇順を明示したい時はASCを付ける
ORDER BY COL1 ASC
降順
-- 降順はDESC
ORDER BY COL1 DESC
複数の列でソート
-- COL1、COL2の昇順
ORDER BY COL1, COL2
-- COL1降順、COL2昇順
ORDER BY COL1 DESC, COL2 ASC
部分文字列でソート
-- 2文字目以降でソート
ORDER BY SUBSTR(COL1,2)
-- 最後の二文字でソート
ORDER BY SUBSTR(COL1,LENGTH(COL1) -1)
置き換え文字でソート
ORDER BY REPLACE(COL1, 'AAA', 'BBB' )
NULLのソート
-- Oracleのみ使える
-- NULLが先頭に来る
ORDER BY COL1 NULLS FIRST
-- NULLが最後に来る
ORDER BY COL1 NULLS LAST
ソートの分岐
-- COL1がAAAのデータはCOL2
-- それ以外はCOL3でソート
ORDER BY CASE WHEN COL1 = 'AAA' THEN COL2 ELSE COL3 END
性能について
- ソートは性能への影響が大きい
- レスポンスが悪いSQLはソートを外すだけで改善する場合もある
- システム稼働時はそうでもないが、データが増えていくと性能劣化する場合がある
- 「ソートした結果から上位〇件を取得」のような場合、全体のソートが走っている
- なので件数を絞っていない場合と処理時間はさほど変わらない
- SUBSTRやREPLACEを使うとソート時にインデックスが効かなくなる
- 副問い合わせなどで不要なソートは避ける
- ソートしてから結合したほうが早い場合もあるが稀にしかない