SQL読解問題(集計・JOIN)

DS検定必出のSQL読解。集計とJOINの典型パターンを素早く理解する訓練。

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;

  1. 1000円超の注文があるカテゴリ全件
  2. 1000円超の注文が10件以上あるカテゴリを件数降順で
  3. 1000円ちょうどの注文を集計
  4. 10件未満のカテゴリのみ
こたえを見る

正解: 2. 1000円超の注文が10件以上あるカテゴリを件数降順で

1000円超の注文が10件以上あるカテゴリを件数降順で。 WHEREで金額絞込→GROUP BY でカテゴリ集計→HAVINGで件数10以上絞込→ORDER BYで降順、という典型パターン。

🔖 この記事の関連書籍

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