Pocket

おはようございます、未経験からITエンジニア転職を目指すいずみです。

前回に引き続き、MySQLのちょっと複雑な検索について、アウトプットしたいと思います。

一週間で身につくMySQL|トップページ~データベースの初心者でも、気軽にSQLが学習できるサイトです。

ちなみに、演習に用いるデータベースは鎌倉殿のcastsテーブルを用います。

並べ替え – 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歳未満のため、表示されません。

まとめ

今回は、並べ替えと集約を行いました。

次回は、テーブルの結合に挑戦してみます。

投稿者

waco@jp

30代未経験でエンジニア転職を目指しています。前職はメーカーで営業と製品開発を担当。22年3月からTechCampを受講し、5月に卒業。現在、就活とオリジナルアプリケーション制作の両輪で活動しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です