SQL道場:JOIN・ウィンドウ関数・CTEまで学べるSQL練習サイト紹介
概要¶
「SQL道場」は初級〜上級の SQL クエリ問題を実際に書いて動かしながら学べる練習サイト。JOIN・サブクエリ・ウィンドウ関数・CTE など実務・面接で問われる内容が体系的に網羅されている。解説付きで答え合わせもできるため、独学や面接直前の総復習に最適。
詳細¶
練習できるSQL構文の概要¶
初級: JOIN の基本¶
-- INNER JOIN: 両テーブルに存在する行のみ
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- LEFT JOIN: users が基準、orders がなくても表示
SELECT u.name, COALESCE(o.amount, 0) AS amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
中級: サブクエリ¶
-- 平均以上の売上を持つユーザーを抽出
SELECT name, total_sales
FROM (
SELECT u.name, SUM(o.amount) AS total_sales
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.name
) AS sales_summary
WHERE total_sales > (SELECT AVG(total_sales) FROM (
SELECT SUM(amount) AS total_sales
FROM orders
GROUP BY user_id
) AS sub);
上級: ウィンドウ関数¶
-- 各ユーザーの注文を金額順にランキング
SELECT
user_id,
order_date,
amount,
RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) AS rank_within_user,
SUM(amount) OVER (PARTITION BY user_id ORDER BY order_date) AS running_total
FROM orders;
-- 前の行との差分(前月比)
SELECT
month,
revenue,
revenue - LAG(revenue, 1) OVER (ORDER BY month) AS mom_diff
FROM monthly_revenue;
上級: CTE(共通テーブル式)¶
-- 階層データを再帰 CTE で展開
WITH RECURSIVE org_tree AS (
-- アンカー: トップレベルの社員
SELECT id, name, manager_id, 1 AS depth
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- 再帰: 部下を順次追加
SELECT e.id, e.name, e.manager_id, ot.depth + 1
FROM employees e
INNER JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT * FROM org_tree ORDER BY depth, name;
面接でよく出る SQL パターン¶
| 問題パターン | 使う構文 |
|---|---|
| N番目に高い値を取得 | DENSE_RANK() + サブクエリ |
| 連続した日付を検出 | LAG() / LEAD() |
| 重複を除いた集計 | COUNT(DISTINCT ...) |
| 木構造の展開 | 再帰 CTE |
| ピボット変換 | CASE WHEN + GROUP BY |
効果的な練習順序¶
1. SELECT / WHERE / ORDER BY / LIMIT の基本
2. GROUP BY / HAVING / 集計関数
3. JOIN(INNER / LEFT / RIGHT / FULL)
4. サブクエリ(WHERE 句 / FROM 句 / EXISTS)
5. CTE(WITH 句)
6. ウィンドウ関数(ROW_NUMBER / RANK / LAG / LEAD / SUM OVER)
7. 再帰 CTE
8. インデックスと実行計画(EXPLAIN ANALYZE)
なぜ重要か / いつ使うか¶
- 技術面接前の SQL 総復習に2〜3日集中して取り組む
- 普段 ORM しか使っていないエンジニアが生 SQL の感覚を取り戻すときに
- データ分析・BI ツールのクエリ最適化で詰まったときの知識補充に
- チームの新メンバーに SQL を教えるときの教材として紹介できる