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
は、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_tanka
とshohin_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 by
とhaving
は、select
よりも先に実行されるため、別名を取得できませんが、order by
は、select
よりも後に実行されるため、別名を指定して実行できるという仕組みです。
今日はここまで。
SQL 第2版 ゼロからはじめるデータベース操作
"https://amzn.to/2QYMBJD"
order by
が分かったのでSQL
はマスターしたも同然!!!!
次回の記事はこちら
SQLのお勉強 14.view
"https://0371.blog/sql-14"