
おはようございます、未経験からITエンジニア転職を目指すいずみです。
前回に引き続き、MySQLのちょっと複雑な検索について、アウトプットしたいと思います。
一週間で身につくMySQL|トップページ~データベースの初心者でも、気軽にSQLが学習できるサイトです。ちなみに、演習に用いるデータベースは鎌倉殿のcastsテーブルを用います。

Contents
並べ替え – ORDER BY –
SELECT文で検索した結果を並べ替えるとき、ORDER BY文を用います。
# 構文
SELECT <列名1> [, 列名2 ...] FROM <テーブル名> [WHERE条件式など]
ORDER BY <列名1> [ASC, DESC] [, 列名2[ASC, DESC] ...]
構文だけでは、ちょっとよくわからないので、分解してみましょう。
1行目のSELECT文以下は、テーブルからデータの抽出をしていますね。
2行目の新しく出てきたORDER BY以降を見てみると、ASCとDESCとあります。これは、
- ASC – 小さい順に並べる昇順
- DESC – 大きい順に並べる降順
を表しています。ちなみにASC/DESCは省略が可能で、省略したときは「ASC」で並べ替えがされます。
それでは、鎌倉殿テーブルにORDER BYを適応させてみます。
年齢順の高い順(DESC)でソートしましょう。
# キャストを年齢の高い順(降順)に並べ替え
SELECT * FROM casts ORDER BY age DESC;

坂東さん、貫禄ありますもんね〜。初大河とは思えません。
集約 – GROUP BY –
一般的にカラムの値を集計するとき、グループ単位で行います。
例えば、キャストの性別を集計する場合、まず“男性”と“女性”のグループに分けてから、それぞれの人数を計算しますね。
SQLでグループ分けをしたいとき、GROUP BY文を用います。
# 構文
SELECT 列名, ... FROM テーブル名GROUP BY列名, ...;
構文だとイメージできないので、実例で確認していきましょう。
鎌倉殿キャストの男性女性の人数を集計します。
まず、性別カラムを選択します。
# 性別のカラムを選択
SELECT sex FROM casts;

性別が抽出できました。ただし、キャストの数だけ抽出されたので、MaleとFemaleが重複していますね。
今回は”性別”を対象としたので、データの種類は2つ(Male/Female)だとわかりますが、他の場合だと、データの種類がいくつあるのかわかりません。
そんなとき、GROUP BYでグループ化しちゃいます。
# 性別カラムのレコードをグループ化
SELECT sex FROM casts GROUP BY sex;

MaleとFemaleの2種類に集約できました!
ちなみに、distinct(明瞭,紛れもないという意)でもグループ化できるみたいです。
SELECT distinct sex FROM casts;
集計と関数
GROUP BYでグループ分けできたので、それぞれの人数を計算しましょう。
そんなときは、GROUP BY文に集計関数を記述します。
# 集計処理の構文
SELECT 列名, ... ,集計関数(集計をとる列名)FROM テーブル名GROUP BY列名, ...;
例のごとく難しいので、実際にいろいろやってみます。
1. 鎌倉殿キャストの男性と女性の人数(集計関数:COUNT)
# 鎌倉殿キャストの男性と女性の人数
SELECT sex, COUNT(sex) FROM casts GROUP BY sex;

男女の人数を抽出できました。
SQLを読み解いていくと、まず“COUNT(sex)”で集計方法と集計結果の表示カラムを定義しています。
集計方法(集計関数)は以下のようなものがあります。
- MAX : 最大値
- MIN : 最小値
- SUM : 合計
- AVG : 平均
- COUNT : 個数のカウント
2. 男性と女性の平均年齢(集計関数:AVG)
集計関数のAVGを用いて、男女それぞれの平均年齢を出してみましょう。
# 鎌倉殿キャストの平均年齢
SELECT sex, AVG(age) FROM casts GROUP BY sex;

集計処理における条件(HAVING句)
集計処理にはHAVING句を用いて、条件をつけることができます。
例えば、平均年齢35歳以上(条件)の性別を出力したいとき、HAVING句を用います。
(数値のカラムが年齢しかないから、例が難しい…)
# HAVING句の構文
SELECT 列名, ... ,集計関数(集計をとる列名)FROM テーブル名GROUP BY列名, ... HAVING 条件式;
例えば、平均年齢35歳以上(条件)の性別を出力したいとき、
(数値のカラムが年齢しかないから、例が難しい…)
# 平均年齢35歳以上の性別
SELECT sex, AVG(age) FROM casts GROUP BY sex HAVING AVG(age) > 35;

女性の平均年齢は35歳未満のため、表示されません。
まとめ
今回は、並べ替えと集約を行いました。
次回は、テーブルの結合に挑戦してみます。