問6 データベース攻略 (SQL記述・ER図)

SQL 記述の頻出パターン、JOIN・GROUP BY・HAVING の使い分け、ER 図読解を整理。

問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 円以上のカテゴリ』を取得するクエリとして正しいものはどれか。

  1. SELECT カテゴリ FROM 商品 WHERE AVG(単価) >= 1000 GROUP BY カテゴリ
  2. SELECT カテゴリ FROM 商品 GROUP BY カテゴリ HAVING AVG(単価) >= 1000
  3. SELECT カテゴリ, AVG(単価) FROM 商品 ORDER BY AVG(単価) DESC
  4. SELECT カテゴリ FROM 商品 WHERE 単価 >= 1000 GROUP BY カテゴリ
こたえを見る

正解: 2. SELECT カテゴリ FROM 商品 GROUP BY カテゴリ HAVING AVG(単価) >= 1000

集約関数 (AVG など) は WHERE では使えず、GROUP BY 後の絞込みは HAVING を使います。1 は構文エラー、4 は『単価 1000 以上の行』だけ取り出すので意味が違います。

鳴海理央、砂原ニコが屋内プールで水泳リレーを楽しむ様子

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。