EXERCISE 90分

演習:データ分析に挑戦

ストーリー

「大変だ!上司から分析レポートを頼まれた!」

「どんなレポート?」

「社員と商品のデータを使って、いくつかの集計データを出してほしいって...」

「大丈夫、Step 5で学んだことを使えば全部できるよ。一つずつやっていこう」


ミッション概要

ここまで学んだORDER BY、LIMIT、集計関数、GROUP BYを使って、8つの分析ミッションに挑戦しましょう。

前提データ

以下のテーブルとデータがある状態で進めます。

employees(8行):

idnamedepartmentsalary
1田中太郎開発部350000
2佐藤花子営業部320000
3鈴木一郎開発部400000
4高橋美咲人事部300000
5伊藤健太営業部280000
6山田次郎開発部290000
7中村美月営業部310000
8小林大輔人事部330000

products(10行):

idnamecategorypricestock
1ノートPC電子機器8900015
2マウス電子機器2500100
3デスク家具350008
4チェア家具4500012
5モニター電子機器3200020
6キーボード電子機器800050
7ヘッドセット電子機器1200030
8ブックシェルフ家具180005
9ウェブカメラ電子機器500025
10デスクライト家具700040

準備

sql
-- SQLiteを起動
-- sqlite3 practice.db

-- 表示設定
.mode column
.headers on

-- データの確認
SELECT * FROM employees;
SELECT * FROM products;

Mission 1: 社員を給料の高い順に表示(ORDER BY)

社員全員を 給料の高い順 に並べて表示してください。

<details> <summary>ヒント</summary>

ORDER BY と DESC を使います。

</details> <details> <summary>解答</summary>
sql
SELECT * FROM employees ORDER BY salary DESC;

実行結果:

id  name      department  salary
--  --------  ----------  ------
3   鈴木一郎  開発部      400000
1   田中太郎  開発部      350000
8   小林大輔  人事部      330000
2   佐藤花子  営業部      320000
7   中村美月  営業部      310000
4   高橋美咲  人事部      300000
6   山田次郎  開発部      290000
5   伊藤健太  営業部      280000
</details>

Mission 2: 価格の安い商品TOP3(ORDER BY + LIMIT)

商品を 価格の安い順 に並べて、上位3件だけ 表示してください。

<details> <summary>ヒント</summary>

ORDER BY で昇順(ASC)に並べて、LIMIT 3 で件数を制限します。

</details> <details> <summary>解答</summary>
sql
SELECT * FROM products ORDER BY price ASC LIMIT 3;

実行結果:

id  name          category  price  stock
--  ------------  --------  -----  -----
2   マウス        電子機器  2500   100
9   ウェブカメラ  電子機器  5000   25
10  デスクライト  家具      7000   40
</details>

Mission 3: 社員の総数を求める(COUNT)

社員の 総数 を求めてください。結果のカラム名は「社員数」にしてください。

<details> <summary>ヒント</summary>

COUNT(*) と AS を使います。

</details> <details> <summary>解答</summary>
sql
SELECT COUNT(*) AS 社員数 FROM employees;

実行結果:

社員数
------
8
</details>

Mission 4: 全社員の平均給料を求める(AVG)

全社員の 平均給料 を求めてください。結果のカラム名は「平均給料」にしてください。

<details> <summary>ヒント</summary>

AVG(salary) と AS を使います。

</details> <details> <summary>解答</summary>
sql
SELECT AVG(salary) AS 平均給料 FROM employees;

実行結果:

平均給料
--------
335000.0
</details>

Mission 5: 商品の最高価格と最低価格を求める(MAX / MIN)

商品の 最高価格最低価格 を同時に求めてください。 それぞれ「最高価格」「最低価格」というカラム名にしてください。

<details> <summary>ヒント</summary>

MAX(price) と MIN(price) を1つのSELECT文で同時に使います。

</details> <details> <summary>解答</summary>
sql
SELECT MAX(price) AS 最高価格, MIN(price) AS 最低価格 FROM products;

実行結果:

最高価格  最低価格
--------  --------
89000     2500
</details>

Mission 6: 部署ごとの社員数と平均給料(GROUP BY)

部署ごと の社員数と平均給料を表示してください。 カラム名は「部署」「社員数」「平均給料」にしてください。

<details> <summary>ヒント</summary>

GROUP BY department を使い、COUNT(*) と AVG(salary) で集計します。

</details> <details> <summary>解答</summary>
sql
SELECT
    department AS 部署,
    COUNT(*) AS 社員数,
    AVG(salary) AS 平均給料
FROM employees
GROUP BY department;

実行結果:

部署    社員数  平均給料
------  ------  ----------------
開発部  3       346666.666666667
営業部  3       303333.333333333
人事部  2       315000.0
</details>

Mission 7: カテゴリごとの商品数・平均価格・合計在庫(GROUP BY + 複数集計)

カテゴリごと の商品数、平均価格、合計在庫を表示してください。 カラム名は「カテゴリ」「商品数」「平均価格」「合計在庫」にしてください。

<details> <summary>ヒント</summary>

GROUP BY category を使い、COUNT(*)、AVG(price)、SUM(stock) で集計します。

</details> <details> <summary>解答</summary>
sql
SELECT
    category AS カテゴリ,
    COUNT(*) AS 商品数,
    AVG(price) AS 平均価格,
    SUM(stock) AS 合計在庫
FROM products
GROUP BY category;

実行結果:

カテゴリ  商品数  平均価格  合計在庫
--------  ------  --------  --------
電子機器  6       24750.0   240
家具      4       26250.0   65
</details>

Mission 8: 平均給料31万円以上の部署を高い順に(Challenge)

平均給料が31万円以上の部署 を、平均給料の高い順 に表示してください。 カラム名は「部署」「平均給料」にしてください。

これはGROUP BY + HAVING + ORDER BY の組み合わせです。

<details> <summary>ヒント</summary>
  1. GROUP BY で部署ごとにグループ化
  2. HAVING で平均給料31万円以上をフィルタ
  3. ORDER BY で平均給料の降順に並べる
</details> <details> <summary>解答</summary>
sql
SELECT
    department AS 部署,
    AVG(salary) AS 平均給料
FROM employees
GROUP BY department
HAVING AVG(salary) >= 310000
ORDER BY 平均給料 DESC;

実行結果:

部署    平均給料
------  ----------------
開発部  346666.666666667
人事部  315000.0

営業部(平均約303,333円)は31万円未満なので除外されています。

</details>

達成度チェック

ミッション内容完了
Mission 1ORDER BY DESC で降順ソート
Mission 2ORDER BY + LIMIT でTop N
Mission 3COUNT(*) で行数カウント
Mission 4AVG() で平均値
Mission 5MAX() / MIN() で最大・最小
Mission 6GROUP BY で部署別集計
Mission 7GROUP BY + 複数集計関数
Mission 8GROUP BY + HAVING + ORDER BY

すべてクリア → Step 5 演習クリア!


まとめ

この演習で使ったSQL構文:

構文用途
ORDER BY ... DESC降順に並び替え
ORDER BY ... LIMIT N上位N件の取得
COUNT(*)行数のカウント
AVG(カラム)平均値の計算
MAX(カラム) / MIN(カラム)最大値・最小値
GROUP BY カラムグループ化して集計
HAVING 条件グループ化後のフィルタ
AS 別名結果にわかりやすい名前をつける

次のステップへ

8つのミッションをクリアできましたか?

次のセクションでは、Step 5の理解度チェック(クイズ)に挑戦します。 ORDER BY、LIMIT、集計関数、GROUP BYの知識を最終確認しましょう!


推定所要時間: 90分