【SQL】ORDER BY:列番号を使わない

  • #SQL

列番号とは

SELECT句で指定した列に、左から1, 2, 3…と順番を割り振った番号のこと

  • この列番号を使って、ORDER BY句を指定することができる
  • 並び替えについて列番号を指定する場合、列番号で指定しない場合
    どちらも同じ結果を返すけど、列番号を使うべきではない

使わないほうがいい理由

1. コードが読みにくくなる

  • SELECT句の列名が多く並んだとき、数えていられない
  • 最初に書くSELECT句と、最後に書くORDER BY句
    距離がもっとも離れているので探していられない

2. この機能は将来削除される可能性がある

SQL-92(1992年に制定されたSQL規格)において、「将来削除されるべき機能」に挙げられた

  • 規格上はいつ削除されてもおかしくない
  • 現在も多くのDBMSで動くが、将来の動作が保証されていない

3. SELECT句の列が増減すると列番号が変わる

  • 列番号で書くためエラーにならない → 事故をする
  • 列名で書いていれば、正しく動くかエラーになるかのどっちかになる

【参考】列番号を指定して並び替える方法

  1. hanbai_tankaを降順に並び替え
  2. 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】ORDER BY:検索結果を並び替える

参考書籍:ミック『SQL 第2版 ゼロからはじめるデータベース操作』(翔泳社)