トップ > SQL入門 > 7章
7章 並び替え(ソート)
今回は実行結果を並び替えて表示する方法について書いていきます。

取得した行を大きい順に並び替えて表示したい場合、ORDER BY句を使用します。
それでは構文を確認してきましょう。

[構文] 並び替え
 SELECT 列名
 FROM 表名
 [WHERE]
 [ORDER BY 列名 [ASC]|DESC];

ORDER BY 列名と指定し、ASCは昇順(小さい順)
DESCは降順(大きい順)で並び替えます。
ASCはデフォルトのため、ASC,DESCを省略した場合は昇順で並び替えます。

ORDER BY 列名;

とした場合、デフォルトの昇順で並び替えます。

また、ORDER BY句はSQLの一番最後に指定します。
順番を間違えるとエラーになりますのでご注意ください。

では、実行例を見ていきましょう。

  SQL> SELECT first_name,salary
    2  FROM employees
    3  ORDER BY salary;

  FIRST_NAME                         SALARY
  ------------------------------ ----------
  Kuroda                            4000000
  Ito                               4000000
  Kamata                            4000000
  Nakamura                          4000000
  Yamamoto                          5000000
  Tao                               5400000
  Koda                              5400000
  …


実行結果がsalary列の値で昇順(小さい順)で並び替えられ表示されています。
次は降順に並び替えて実行してみます。

  SQL> SELECT first_name,salary
    2  FROM employees
    3  ORDER BY salary desc;

  FIRST_NAME                         SALARY
  ------------------------------ ----------
  Suzuki                           10000000
  Sato                              8000000
  Saito                             6700000
  Sinagawa                          6500000
  Kato                              6500000
  Kataoka                           6500000
  …


次に文字データ、日付データでもORDER BY句を使用した場合について確認していきましょう。
昇順の場合、文字データはアルファベットA順、日付データは、古い日付順となります。
降順の場合、文字データはアルファベットZ順、日付データは、新しい日付順となります。

  SQL> SELECT first_name,salary
    2  FROM employees
    3  ORDER BY first_name desc;

  FIRST_NAME                         SALARY
  ------------------------------ ----------
  Yamamoto                          5000000
  Watanabe                          5500000
  Watanabe                          6000000
  Totsuka                           5400000
  Tao                               5400000
  Suzuki                           10000000
  Sinagawa                          6500000
  Sato                              8000000
  Saito                             6700000
  Nakamura                          4000000
  Kuroda                            4000000
  Koda                              5400000
  Koda                              6400000
  Kato                              6500000
  Kataoka                           6500000
  Kaneko                            5400000
  Kamata                            4000000
  Ito                               4000000
  Harada                            6200000
  Akagi                             6400000

  20 rows selected.


上記例ではfirst_nameを降順に並び替えて表示しているため、
先頭は「Yamamoto」、最後は「Akagi」
で表示されていることがわかります。

  SQL> SELECT first_name,hire_date
    2  FROM employees
    3  ORDER BY hire_date desc;

  FIRST_NAME                     HIRE_DATE
  ------------------------------ ---------
  Kamata                         01-APR-13
  Nakamura                       01-APR-13
  Kuroda                         01-APR-13
  Ito                            01-APR-13
  Sinagawa                       01-APR-09
  Kato                           01-APR-09
  Totsuka                        29-SEP-03
  Tao                            28-JUL-03
  Akagi                          01-MAR-01
  Kaneko                         22-FEB-01
  Koda                           01-OCT-00
  Saito                          01-OCT-00
  Harada                         01-OCT-00
  Kataoka                        01-OCT-00
  Watanabe                       14-MAY-98
  Watanabe                       01-APR-98
  Koda                           01-APR-97
  Yamamoto                       11-MAR-95
  Sato                           11-OCT-92
  Suzuki                         07-OCT-92

  20 rows selected.


次の例では、hire_date列を降順で並び替えています。
その為、先頭は「01-APR-13」一番新しい日付から表示されていることがわかります。

以下の例は、列別名を指定し、ORDER BY句に列別名を指定しています。

  SQL> SELECT first_name as name,hire_date
    2  FROM employees
    3  ORDER BY name;

  NAME                           HIRE_DATE
  ------------------------------ ---------
  Akagi                          01-MAR-01
  Harada                         01-OCT-00
  Ito                            01-APR-13
  Kamata                         01-APR-13
  Kaneko                         22-FEB-01
  Kataoka                        01-OCT-00
  Kato                           01-APR-09
  Koda                           01-OCT-00
  Kuroda                         01-APR-13
  Nakamura                       01-APR-13
  Saito                          01-OCT-00
  Sato                           11-OCT-92
  Sato                           01-APR-97
  Sinagawa                       01-APR-09
  Suzuki                         07-OCT-92
  Tao                            28-JUL-03
  Totsuka                        29-SEP-03
  Watanabe                       14-MAY-98
  Watanabe                       01-APR-98
  Yamamoto                       11-MAR-95

  20 rows selected.


またORDER BY句には列名を指定しましたが、列番号で実行することもできます。
列番号とはSELECT句で指定している列の順番です。

SELECT first_name,hire_date

上記の場合、ORDER BY 1とした場合は、first_nameで並び替えます。
ORDER BY 2とした場合は、hire_dateで並び替えます。

以下、実行例となります。

  SQL> SELECT first_name,hire_date
    2  FROM employees
    3  ORDER BY 1 desc;

  FIRST_NAME                     HIRE_DATE
  ------------------------------ ---------
  Yamamoto                       11-MAR-95
  Watanabe                       14-MAY-98
  Watanabe                       01-APR-98
  Totsuka                        29-SEP-03
  Tao                            28-JUL-03
  Suzuki                         07-OCT-92
  Sinagawa                       01-APR-09
  Sato                           01-APR-97
  Sato                           11-OCT-92
  Saito                          01-OCT-00
  Nakamura                       01-APR-13
  Kuroda                         01-APR-13
  Koda                           01-OCT-00
  Kato                           01-APR-09
  Kataoka                        01-OCT-00
  Kaneko                         22-FEB-01
  Kamata                         01-APR-13
  Ito                            01-APR-13
  Harada                         01-OCT-00
  Akagi                          01-MAR-01

  20 rows selected.


ORDER BY句に複数の列を指定することも可能です。
以下の例では、salary列を降順に並び替え、
さらにsalary列が同じ値の場合、hire_date列を昇順で並び替えます。

  SQL> SELECT first_name,salary,hire_date
    2  FROM employees
    3  ORDER BY salary desc ,hire_date;

  FIRST_NAME                         SALARY HIRE_DATE
  ------------------------------ ---------- ---------
  Suzuki                           10000000 07-OCT-92
  Sato                              8000000 11-OCT-92
  Saito                             6700000 01-OCT-00
  Kataoka                           6500000 01-OCT-00
  Sinagawa                          6500000 01-APR-09
  Kato                              6500000 01-APR-09
  Koda                              6400000 01-OCT-00
  Akagi                             6400000 01-MAR-01
  Harada                            6200000 01-OCT-00
  Watanabe                          6000000 01-APR-98
  Watanabe                          5500000 14-MAY-98
  Sato                              5400000 01-APR-97
  Kaneko                            5400000 22-FEB-01
  Tao                               5400000 28-JUL-03
  Totsuka                           5400000 29-SEP-03
  Yamamoto                          5000000 11-MAR-95
  Kuroda                            4000000 01-APR-13
  Nakamura                          4000000 01-APR-13
  Kamata                            4000000 01-APR-13
  Ito                               4000000 01-APR-13

  20 rows selected.


実行結果のsalary列が「6500000」のhire_date列の値が昇順となっているのがわかりますね。

並び替えを行うことでより見やすい実行結果を得られることができるようになりました。

[補足] 試験対策のまとめ

・ORDER BYのデフォルトは昇順(ASC)
・ORDER BY句は必ずSQL文の最後に指定する
・ORDER BY句には列別名も指定が可能
・ORDER BY句には列番号も指定が可能