SQLのお勉強 13.order by

2020-09-21

こんにちは、0371です。

今回は、SQLのお勉強をしたいと思います。
基本情報技術者試験で出題される範囲を中心に進めます。

お勉強

※ PostgreSQLはインストール済みかつ、パスも通しているという前提で進めていきます。

分からないという方は、以下の記事から始めてください。

dockerを使って、再構築が容易なSQLの練習場を作成する
"https://0371.blog/docker-sql"

前回の記事はこちら

SQLのお勉強 12.having
"https://0371.blog/sql-12"

order by

order byを使用することで、行の並び順を指定することができます。

order byは、SQL文の末尾に記述します。

以下のように使用します。

select 列名1, 列名2, 列名3 from テーブル名 order by 並び替えの基準となる列1, 並び替えの基準となる列2;

下に昇順に並び替えを行った例を挙げます。

select shohin_id, shohin_mei, hanbai_tanka, shiire_tanka from Shohin order by hanbai_tanka;

hanbai_tankaを基準に、行が昇順で並び替えられています。
昇順に並び替えをする場合は、order by 列名 asc;と書きますが、ascは省略可能です。

 shohin_id |   shohin_mei   | hanbai_tanka | shiire_tanka 
-----------+----------------+--------------+--------------
 0008      | ボールペン     |          100 |             
 0006      | フォーク       |          500 |             
 0002      | 穴あけパンチ   |          500 |          320
 0007      | おろし金       |          880 |          790
 0001      | Tシャツ        |         1000 |          500
 0004      | 包丁           |         3000 |         2800
 0003      | カッターシャツ |         4000 |         2800
 0005      | 圧力鍋         |         6800 |         5000
(8 rows)

降順に並び替えを行った例を挙げます。

select shohin_id, shohin_mei, hanbai_tanka, shiire_tanka from Shohin order by hanbai_tanka desc;

hanbai_tankaを基準に、行が降順で並び替えられています。
昇順に並び替えをする場合は、order by 列名 desc;と書きます。
descは省略できません。

 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 |             
 0008      | ボールペン     |          100 |             

並び替えの条件を複数にすることもできます。

select shohin_id, shohin_mei, hanbai_tanka, shiire_tanka from Shohin order by hanbai_tanka, shohin_id;

hanbai_tankashohin_idを基準に、行が昇順で並び替えられます。
hanbai_tankaに500の値が二つあります。
この同順位の行をさらに細かくソートしたい場合には、別の並び替えの基準を指定します。

 shohin_id |   shohin_mei   | hanbai_tanka | shiire_tanka 
-----------+----------------+--------------+--------------
 0008      | ボールペン     |          100 |             
 0002      | 穴あけパンチ   |          500 |          320
 0006      | フォーク       |          500 |             
 0007      | おろし金       |          880 |          790
 0001      | Tシャツ        |         1000 |          500
 0004      | 包丁           |         3000 |         2800
 0003      | カッターシャツ |         4000 |         2800
 0005      | 圧力鍋         |         6800 |         5000
(8 rows)           

最初の例と比べると、穴あけパンチとフォークの順番が変わっているのがわかると思います。
左側の並び替え基準が優先され、その中で同じ値が存在した場合に、右側の並び替え基準が適応されるという流れです。

nullは並び替えの時には、先頭か末尾にまとめて表示されます。

select shohin_id, shohin_mei, hanbai_tanka, shiire_tanka from Shohin order by shiire_tanka;

nullが先頭に来るか、末尾に来るかは決まっていません。

 shohin_id |   shohin_mei   | hanbai_tanka | shiire_tanka 
-----------+----------------+--------------+--------------
 0002      | 穴あけパンチ   |          500 |          320
 0001      | Tシャツ        |         1000 |          500
 0007      | おろし金       |          880 |          790
 0003      | カッターシャツ |         4000 |         2800
 0004      | 包丁           |         3000 |         2800
 0005      | 圧力鍋         |         6800 |         5000
 0006      | フォーク       |          500 |             
 0008      | ボールペン     |          100 |             
(8 rows)         

order byの場合は、selectでつけた列の別名も指定できます。

select shohin_id as id, shohin_mei, hanbai_tanka, shiire_tanka from Shohin order by id;
  id  |   shohin_mei   | hanbai_tanka | shiire_tanka 
------+----------------+--------------+--------------
 0001 | Tシャツ        |         1000 |          500
 0002 | 穴あけパンチ   |          500 |          320
 0003 | カッターシャツ |         4000 |         2800
 0004 | 包丁           |         3000 |         2800
 0005 | 圧力鍋         |         6800 |         5000
 0006 | フォーク       |          500 |             
 0007 | おろし金       |          880 |          790
 0008 | ボールペン     |          100 |             

group byは、selectよりも先に実行されるため、別名を取得できませんが、order byは、selectよりも後に実行されるため、別名を指定して実行できるという仕組みです。

order byは、selectの中にない列名も指定できます。

select shohin_mei, hanbai_tanka, shiire_tanka from Shohin order by shohin_id;

直前の例と並び順が一緒ですね。

   shohin_mei   | hanbai_tanka | shiire_tanka 
----------------+--------------+--------------
 Tシャツ        |         1000 |          500
 穴あけパンチ   |          500 |          320
 カッターシャツ |         4000 |         2800
 包丁           |         3000 |         2800
 圧力鍋         |         6800 |         5000
 フォーク       |          500 |             
 おろし金       |          880 |          790
 ボールペン     |          100 |             
(8 rows)

order byは、集約関数も指定できます。

select shohin_bunrui, count(*) from Shohin group by shohin_bunrui order by count(*);

shohin_bunruiごとにcountした結果を、countの昇順で取得しています。

 shohin_bunrui | count 
---------------+-------
 衣服          |     2
 事務用品      |     2
 キッチン用品  |     4
(3 rows)

group byhavingは、selectよりも先に実行されるため、別名を取得できませんが、order byは、selectよりも後に実行されるため、別名を指定して実行できるという仕組みです。

今日はここまで。

参考書籍

SQL 第2版 ゼロからはじめるデータベース操作
"https://amzn.to/2QYMBJD"

今日の一言

order byが分かったのでSQLはマスターしたも同然!!!!

次回の記事はこちら

SQLのお勉強 14.view
"https://0371.blog/sql-14"