【SQL】ORDER BY:列番号を使わない
列番号とは
SELECT句で指定した列に、左から1, 2, 3…と順番を割り振った番号のこと
- この列番号を使って、
ORDER BY句を指定することができる - 並び替えについて列番号を指定する場合、列番号で指定しない場合
どちらも同じ結果を返すけど、列番号を使うべきではない
使わないほうがいい理由
1. コードが読みにくくなる
SELECT句の列名が多く並んだとき、数えていられない- 最初に書く
SELECT句と、最後に書くORDER BY句
距離がもっとも離れているので探していられない
2. この機能は将来削除される可能性がある
SQL-92(1992年に制定されたSQL規格)において、「将来削除されるべき機能」に挙げられた
- 規格上はいつ削除されてもおかしくない
- 現在も多くのDBMSで動くが、将来の動作が保証されていない
3. SELECT句の列が増減すると列番号が変わる
- 列番号で書くためエラーにならない → 事故をする
- 列名で書いていれば、正しく動くかエラーになるかのどっちかになる
【参考】列番号を指定して並び替える方法
hanbai_tankaを降順に並び替えshohin_idを昇順に並び替え
/* 列番号で指定しない場合 */
SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM Shohin
ORDER BY hanbai_tanka DESC, shohin_id ASC;
/* 販売単価は降順に並んでいる
販売単価が同じとき、商品IDは昇順で並んでいる */
shohin_id | shohin_mei | hanbai_tanka | shiire_tanka
-----------+----------------+--------------+--------------
0005 | 圧力鍋 | 6800 | 5000
0003 | カッターシャツ | 4000 | 2800
0004 | 包丁 | 3000 | 2800
0001 | Tシャツ | 1000 | 500
0007 | おろしがね | 880 | 790
0002 | 穴あけパンチ | 500 | 320
0006 | フォーク | 500 | --商品ID:0006
0008 | ボールペン | 100 | --商品ID:0008
列番号をつけるとこうなる↓
SELECT shohin_id(1), shohin_mei(2), hanbai_tanka(3), shiire_tanka(4) FROM…
/* 列番号で指定する場合
hanbai_tanka→3, shohin_id→1 */
SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM Shohin
ORDER BY 3 DESC, 1 ASC;
/* 販売単価は降順に並んでいる
販売単価が同じとき、商品IDは昇順で並んでいる
(列番号で指定しない場合と結果が一致) */
shohin_id | shohin_mei | hanbai_tanka | shiire_tanka
-----------+----------------+--------------+--------------
0005 | 圧力鍋 | 6800 | 5000
0003 | カッターシャツ | 4000 | 2800
0004 | 包丁 | 3000 | 2800
0001 | Tシャツ | 1000 | 500
0007 | おろしがね | 880 | 790
0002 | 穴あけパンチ | 500 | 320
0006 | フォーク | 500 | --商品ID:0006
0008 | ボールペン | 100 | --商品ID:0008
参考書籍:ミック『SQL 第2版 ゼロからはじめるデータベース操作』(翔泳社)