コンテンツにスキップ

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 を教えるときの教材として紹介できる