情報II / 情報システムとプログラミング 3 / 6

SQL応用 — 集計・結合でデータを引き出す

SQL応用 — 集計・結合でデータを引き出す

正規化によって表を分けたデータベースから必要な情報を取り出すには、SQLの応用操作が必要になります。この講義では、並べ替え(ORDER BY)、集計(GROUP BYと集計関数)、そして複数の表をつなぐ結合(JOIN)を学びます。ここまで使えれば、実務のデータ分析の入口に立てます。

基本形の復習と並べ替え

SQLの基本形は SELECT 列名 FROM 表名 WHERE 条件; でした。結果を並べ替えるにはORDER BYを付けます。ORDER BY 得点 DESC なら得点の大きい順(降順)、ASC(省略時)なら小さい順(昇順)です。

集計関数 — 数える・合計する・平均する

SQLには、複数の行をまとめて1つの値を計算する集計関数があります。

COUNT(*):行数を数える ・SUM(列):合計 ・AVG(列):平均 ・MAX(列)MIN(列):最大・最小

GROUP BY — グループごとに集計する

GROUP BYを使うと、指定した列の値が同じ行どうしをグループにまとめ、グループごとに集計関数を適用できます。「商品ごとの売上合計」「クラスごとの平均点」のような集計はすべてこの形です。

📘 例 売上表が次の5行だとします。

売上ID商品名数量
1りんご3
2みかん2
3りんご5
4みかん4
5りんご2

SELECT 商品名, SUM(数量) FROM 売上表 GROUP BY 商品名;

を実行すると、りんごのグループ(3+5+2)とみかんのグループ(2+4)に分けて合計され、結果は「りんご 10、みかん 6」の2行になります。さらに HAVING SUM(数量) >= 10 を付ければ「合計10個以上の商品だけ」(=りんごのみ)に絞れます。WHEREが「集計前の行」を絞るのに対し、HAVINGは「集計後のグループ」を絞る点が違いです。

JOIN — 分けた表をつなぎ直す

正規化で分割した表は、結合(JOIN)によってつなぎ直して使います。最も基本的な内部結合(INNER JOIN)は、2つの表を共通の列(外部キーと主キー)で突き合わせ、一致した行どうしを横につなげます。

SELECT 生徒表.氏名, 貸出表.貸出日
FROM 貸出表
INNER JOIN 生徒表 ON 貸出表.学籍番号 = 生徒表.学籍番号;

このSQLは「貸出表の各行について、学籍番号が一致する生徒表の行をつなぎ、氏名と貸出日を取り出す」という意味です。貸出表には学籍番号しか入っていなくても、結合すれば氏名付きの一覧が得られます。正規化で分けて、JOINでつなぐ — これがリレーショナルデータベースの基本の使い方です。

💡 ポイント
  • ORDER BY で並べ替え(DESC=降順、ASC=昇順)。
  • 集計関数はCOUNT・SUM・AVG・MAX・MIN。
  • GROUP BY 列名 で「その列の値ごと」に集計。HAVINGは集計後の絞り込み。
  • WHEREは行の絞り込み(集計前)、HAVINGはグループの絞り込み(集計後)。
  • INNER JOIN ... ON で外部キーと主キーを突き合わせ、表をつなぐ。

練習問題

  1. 得点表に70点、80点、90点の3行があるとき、SELECT AVG(得点) FROM 得点表; の結果を答えなさい。
  2. 本文の売上表に対して SELECT 商品名, COUNT(*) FROM 売上表 GROUP BY 商品名; を実行した結果を答えなさい。
  3. 「クラス表(クラスID、クラス名)」と「生徒表(学籍番号、氏名、クラスID)」から、氏名とクラス名の一覧を取り出すには、どの列とどの列を突き合わせて結合すればよいか答えなさい。

解答・解説

  1. 解答:80
    解説:AVGは平均を求める集計関数。(70+80+90)÷3=240÷3=80。
  2. 解答:りんご 3、みかん 2
    解説:COUNT(*)は行数を数える。りんごの行は売上ID 1・3・5の3行、みかんは2・4の2行。SUM(数量)(10と6)との違いに注意。
  3. 解答:生徒表のクラスID(外部キー)とクラス表のクラスID(主キー)を突き合わせて結合する。
    解説:SELECT 生徒表.氏名, クラス表.クラス名 FROM 生徒表 INNER JOIN クラス表 ON 生徒表.クラスID = クラス表.クラスID; のように書ける。
🔒

続きは無料アカウントで読めます

このレッスンの続きと、AIに教えて学ぶ機能が使えます。登録は無料です。

無料でアカウントを作る ログイン

このレッスンのQ&A

読み込み中...