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を使うと、指定した列の値が同じ行どうしをグループにまとめ、グループごとに集計関数を適用できます。「商品ごとの売上合計」「クラスごとの平均点」のような集計はすべてこの形です。
| 売上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 で外部キーと主キーを突き合わせ、表をつなぐ。
練習問題
- 得点表に70点、80点、90点の3行があるとき、
SELECT AVG(得点) FROM 得点表;の結果を答えなさい。 - 本文の売上表に対して
SELECT 商品名, COUNT(*) FROM 売上表 GROUP BY 商品名;を実行した結果を答えなさい。 - 「クラス表(クラスID、クラス名)」と「生徒表(学籍番号、氏名、クラスID)」から、氏名とクラス名の一覧を取り出すには、どの列とどの列を突き合わせて結合すればよいか答えなさい。
解答・解説
- 解答:80
解説:AVGは平均を求める集計関数。(70+80+90)÷3=240÷3=80。 - 解答:りんご 3、みかん 2
解説:COUNT(*)は行数を数える。りんごの行は売上ID 1・3・5の3行、みかんは2・4の2行。SUM(数量)(10と6)との違いに注意。 - 解答:生徒表のクラスID(外部キー)とクラス表のクラスID(主キー)を突き合わせて結合する。
解説:SELECT 生徒表.氏名, クラス表.クラス名 FROM 生徒表 INNER JOIN クラス表 ON 生徒表.クラスID = クラス表.クラスID; のように書ける。