DS検定で必出のSQLコード読解。集計とJOINの典型パターンを素早く読む訓練。
SQL のコード読解問題、長くて読むの大変だよね…
ブロックごとの『役割』を読み取れば、ぐっと速くなるのよ。 SELECT・FROM・WHERE・GROUP BY・HAVING・ORDER BY、それぞれが『何をしているか』を見極めてみて。
-- ▼ 問題例1: 結果は何件? SELECT category, SUM(amount) AS total FROM orders WHERE ordered_at >= '2024-01-01' AND status = 'completed' GROUP BY category HAVING SUM(amount) >= 100000 ORDER BY total DESC LIMIT 5; -- 解読: -- 1. orders テーブルから -- 2. 2024年以降かつ完了状態の注文を絞り込み -- 3. category ごとに合計売上を集計 -- 4. 合計10万円以上のカテゴリのみ -- 5. 合計の降順で並べ -- 6. 上位5件を取得 -- ▼ 問題例2: JOIN の動作 SELECT c.customer_id, c.name, COUNT(o.order_id) AS num_orders FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id AND o.status = 'completed' GROUP BY c.customer_id, c.name ORDER BY num_orders DESC; -- ポイント: -- - LEFT JOIN なので、注文がない顧客も結果に残る -- - ON句の status = 'completed' は、JOIN条件の一部 -- - WHERE で書くのと挙動が違うので注意 (LEFT JOIN特有) -- - COUNT(o.order_id) は NULL を数えないので、注文ない顧客は0
問題例2の JOIN条件とWHERE条件の違いは特に頻出。 LEFT JOINで右側の絞り込みをWHERE に書くと、結果的にINNER JOINと同じになる罠がある。
うぅ〜ん…それは罠ですねぇ…
他に頻出パターンある?
-- ▼ 問題例3: 複数テーブル JOIN SELECT c.region, p.category, SUM(oi.quantity * oi.unit_price) AS revenue FROM orders o INNER JOIN customers c ON o.customer_id = c.customer_id INNER JOIN order_items oi ON o.order_id = oi.order_id INNER JOIN products p ON oi.product_id = p.product_id WHERE o.ordered_at >= '2024-01-01' GROUP BY c.region, p.category ORDER BY revenue DESC; -- 解読: -- - 4テーブル (orders, customers, order_items, products) を結合 -- - 結果は『地域 × カテゴリ』の売上集計 -- - SUM(数量 × 単価) で売上を計算
4テーブルJOINになると見た目は複雑だけど、ON句のつながりを追えば意味は明確になるのよ。 まず最初に『どのテーブルを何と結合しているか』を確認すること、ね。
DS検定★ では、このレベルのSQLが普通に出題されます。 1問あたり1〜2分で読み切れるように訓練しておきましょう。
確認クイズ
次のSQLの結果として正しいのはどれか: SELECT category, COUNT(*) FROM orders WHERE amount > 1000 GROUP BY category HAVING COUNT(*) >= 10 ORDER BY COUNT(*) DESC;
- 1000円超の注文があるカテゴリ全件
- 1000円超の注文が10件以上あるカテゴリを件数降順で
- 1000円ちょうどの注文を集計
- 10件未満のカテゴリのみ
こたえを見る
正解: 2. 1000円超の注文が10件以上あるカテゴリを件数降順で
1000円超の注文が10件以上あるカテゴリを件数降順で。 WHEREで金額絞込→GROUP BY でカテゴリ集計→HAVINGで件数10以上絞込→ORDER BYで降順、という典型パターン。