アリクイのデータベース勉強記録

データベースやプログラミングについて勉強した内容を発信していきます。

【SQL入門編】並び替えや集計操作

今回はデータを見やすくする操作全般について紹介します。 難しい操作はありませんが使用頻度は高い内容かと思います。

SQLにコメントを挿入する

別のサイトや業務で使うSQLに普通に日本語で書かれている文章を見かけて戸惑った方もいらっしゃるかもしれませんね。 実はSQL内に文字列にコメントを残すことができます。 書き方は簡単で、半角ハイフン(-)を二つ並べて半角スペースを挿入してからコメントとして残せます。

-- 社員情報のテーブル
SELECT * -- SQLの途中でもコメントを残せます。
FROM animals; 

コメントを残しておくと後でSQLを見直した時に分かりやすく便利なのでぜひ活用してみてください。

カラムの表示名を変える

(併せてテーブル名も別の名前に置き換える) カラム名の後に(AS) 表示したい文字を入れるだけで簡単に表示名を変えることが可能です。 サイトによってASがついていたり逆になかったりで分かりにくいかもしれませんがどちらでも大丈夫です。 (慣れないうちはASも含めて書いたほうが見直した時に分かりやすいかと思いますが…)

こちらは前回JOINしたテーブルを使用してみます。

db-arikui.hatenablog.com

SELECT 
a.id AS 社員番号, -- カラム名の後にAS表示したい文字
a.name 社員名, -- 実はASは省略可能 
a.group_code 部署コード,
w.group_name 部署名
FROM animals AS a -- テーブル名もASを使用して置き換え可能(JOINするときに毎回入れると大変)
INNER JOIN work_group w -- こちらもASは省略可能
ON
a.group_code = w.group_code;

+----------+--------------------+------------+------------------+
| 社員番号 | 社員名             | 部署コード | 部署名           |
+----------+--------------------+------------+------------------+
|        1 | アリクイ           |          2 | システム開発部   |
|        2 | チベットスナギツネ |          2 | システム開発部   |
|        3 | マヌルネコ         |          3 | サポートセンター |
|        4 | ハダカデバネズミ   |          1 | 営業部           |
|        5 | ホンドギツネ       |          3 | サポートセンター |
+----------+--------------------+------------+------------------+

昇順降順でソートする

試しに入社日(join_day)を起点にして昇順降順でソートをかけてみます。 SELECT カラム FROM テーブル名 ORDER BY 並び変える基準になるカラム 

SELECT * FROM animals
ORDER BY
join_day;

+----+--------------------+------------+------------+------------+
| id | name               | group_code | join_day   | out_day    |
+----+--------------------+------------+------------+------------+
|  5 | ホンドギツネ       |          3 | 2010-12-01 | 1111-11-11 |
|  3 | マヌルネコ         |          3 | 2017-06-01 | 1111-11-11 |
|  4 | ハダカデバネズミ   |          1 | 2017-06-01 | 2022-03-31 |
|  1 | アリクイ           |          2 | 2019-04-01 | 1111-11-11 |
|  2 | チベットスナギツネ |          2 | 2019-05-01 | 1111-11-11 |
|  6 | オオサンショウウオ |          5 | 2022-06-01 | 1111-11-11 |
+----+--------------------+------------+------------+------------+

カラムを指定した後にDESCと入力することで降順での表示が可能になります。

SELECT * FROM animals
ORDER BY
join_day DESC;

+----+--------------------+------------+------------+------------+
| id | name               | group_code | join_day   | out_day    |
+----+--------------------+------------+------------+------------+
|  6 | オオサンショウウオ |          5 | 2022-06-01 | 1111-11-11 |
|  2 | チベットスナギツネ |          2 | 2019-05-01 | 1111-11-11 |
|  1 | アリクイ           |          2 | 2019-04-01 | 1111-11-11 |
|  3 | マヌルネコ         |          3 | 2017-06-01 | 1111-11-11 |
|  4 | ハダカデバネズミ   |          1 | 2017-06-01 | 2022-03-31 |
|  5 | ホンドギツネ       |          3 | 2010-12-01 | 1111-11-11 |
+----+--------------------+------------+------------+------------+

属性ごとにデータの件数や最大値、最小値、平均値、合計値で集計する

①FROM テーブル名 GROUP BYで合計や件数などで集計したいカラムを選択する ②集合関数でどうやってまとめるかを指定する 集合関数はSELECTでカラムを指定する時に集合関数(カラム名)で使用することができます。 集合関数は以下の通り COUNT:GROUP BYで指定したカラムの各データが何件あるかを表示する MAX:GROUP BYで指定したカラムの各データの中で最大のものを表示する MIN:GROUP BYで指定したカラムの各データの中で最小のものを表示する AVG:GROUP BYで指定したカラムの各データの平均値を表示する SUM:GROUP BYで指定したカラムの各データの合計を表示する

試しに以下のSQLを実行してみましょう。

SELECT 
group_code, -- 部署ごとで
MAX(join_day)-- MAX(join_day)で入社日が一番大きい(最近入社した)社員を表示する
FROM animals
GROUP BY
group_code;

+------------+---------------+
| group_code | MAX(join_day) |
+------------+---------------+
|          2 | 2019-05-01    |
|          3 | 2017-06-01    |
|          1 | 2017-06-01    |
|          5 | 2022-06-01    |
+------------+---------------+

これで各部署で入社日が一番大きい(最近入社した)社員を表示することができました。 (若干見栄えが悪いですが…)

せっかくなので最後にGROUP BYとORDER BYを組み合わせてgroup_code順に並び変えてみましょう。

SELECT 
group_code, -- 部署ごとで
MAX(join_day)-- MAX(join_day)で入社日が一番大きい(最近入社した)社員を表示する
FROM animals
GROUP BY
group_code
ORDER BY -- ORDER BYでgroup_code順に並び変える
group_code;

+------------+---------------+
| group_code | MAX(join_day) |
+------------+---------------+
|          1 | 2017-06-01    |
|          2 | 2019-05-01    |
|          3 | 2017-06-01    |
|          5 | 2022-06-01    |
+------------+---------------+

本日はここまで! 使用頻度が高い操作ばかりなのでぜひマスターしてみてください!