問6 (DB) は SQL 記述と ER 図の読解。INNER JOIN・GROUP BY・サブクエリの基本構文を確実に書けるように。
問6 の典型題材: ① ER 図の読解、② SQL 記述 (主に SELECT)、③ 正規化 (1NF→3NF)、④ トランザクション・分離レベル、⑤ インデックス設計と性能。
SQL書くの、初見だとちょっと難しいなぁ…
頻出パターンは数個に絞られるわ: ① 単純な SELECT + WHERE、② 2表 INNER JOIN、③ GROUP BY + 集約関数 + HAVING、④ ROW_NUMBER で順位付け。
これが書ければ、問6で40点は取れるわよ。
📝 過去問サンプル (SQL 記述)
『商品』表 (商品ID, 商品名, 単価) と『注文明細』表 (注文ID, 商品ID, 数量) から、商品ごとに『総注文数量』を計算し、数量が多い順に上位5件を取得する SQL を記述しなさい。
-- 模範解答 SELECT s.商品ID, s.商品名, SUM(o.数量) AS 総数量 FROM 商品 s INNER JOIN 注文明細 o ON s.商品ID = o.商品ID GROUP BY s.商品ID, s.商品名 ORDER BY 総数量 DESC FETCH FIRST 5 ROWS ONLY;
【部分点ポイント】 ・JOIN ができている (10点目安) ・GROUP BY が正しい (10点目安) ・ORDER BY DESC が書けている (5点目安) ・LIMIT/FETCH FIRST が書けている (5点目安) 【減点ポイント】 × WHERE で集約関数を書く (構文エラー) × GROUP BY 句に集約していない列が漏れる × JOIN 条件が書けていない (デカルト積) × ORDER BY ASC (逆順)
GROUP BYのとき、SELECTに書ける列のルールって、どうだったかなぁ…?
標準SQLでは『GROUP BY句にある列』か『集約関数の中の列』のみがSELECT可能です。
MySQLは緩いですが、APでは標準準拠で書きましょう。
問6 は科目Aの DB 知識がそのまま使えるから、科目Aで取れている人は科目Bでも取りやすい分野よ。
確認クイズ
次の SQL のうち、『各商品カテゴリ別の平均単価が 1000 円以上のカテゴリ』を取得するクエリとして正しいものはどれか。
- SELECT カテゴリ FROM 商品 WHERE AVG(単価) >= 1000 GROUP BY カテゴリ
- SELECT カテゴリ FROM 商品 GROUP BY カテゴリ HAVING AVG(単価) >= 1000
- SELECT カテゴリ, AVG(単価) FROM 商品 ORDER BY AVG(単価) DESC
- SELECT カテゴリ FROM 商品 WHERE 単価 >= 1000 GROUP BY カテゴリ
こたえを見る
正解: 2. SELECT カテゴリ FROM 商品 GROUP BY カテゴリ HAVING AVG(単価) >= 1000
集約関数 (AVG など) は WHERE では使えず、GROUP BY 後の絞込みは HAVING を使います。1 は構文エラー、4 は『単価 1000 以上の行』だけ取り出すので意味が違います。