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句には列番号も指定が可能