SQL 練習問題 62 問

SQL道場に入っている練習問題を 1 ページに並べました (初級16問・中級22問・上級24問)。 気になる問題をクリックすると、そのレッスンの解説と ブラウザ内で動く SQLite のエディタに移動します。 解説を読まずに問題だけ解いても構いません。

全 62 問

  1. productsテーブルの全データを取得してください。初級SQL入門 / SELECT — データを取得する10pt
  2. productsテーブルから name と price の列だけ取得してください。初級SQL入門 / SELECT — データを取得する15pt
  3. customersテーブルの全データを取得してください。初級SQL入門 / SELECT — データを取得する10pt
  4. productsテーブルからカテゴリが「電子機器」の商品を全て取得してください。初級SQL入門 / WHERE — 条件でデータを絞る10pt
  5. productsテーブルから価格が10000円以上の商品の name と price を取得してください。初級SQL入門 / WHERE — 条件でデータを絞る15pt
  6. customersテーブルから東京在住の顧客を全て取得してください。初級SQL入門 / WHERE — 条件でデータを絞る10pt
  7. productsテーブルから価格が1000円以上10000円以下の商品を取得してください。初級SQL入門 / WHERE — 条件でデータを絞る15pt
  8. productsテーブルの全商品を価格の安い順(昇順)で取得してください。初級SQL入門 / ORDER BY / LIMIT — 並び替えと件数制限10pt
  9. productsテーブルから価格の高い順に上位3件の name と price を取得してください。初級SQL入門 / ORDER BY / LIMIT — 並び替えと件数制限15pt
  10. customersテーブルの顧客を年齢の若い順(昇順)で全員取得してください。初級SQL入門 / ORDER BY / LIMIT — 並び替えと件数制限10pt
  11. productsテーブルの商品数(全行数)を取得してください。初級SQL入門 / 集計関数 — COUNT・SUM・AVG・MAX・MIN10pt
  12. productsテーブルの全商品の合計在庫数(stockの合計)を取得してください。初級SQL入門 / 集計関数 — COUNT・SUM・AVG・MAX・MIN15pt
  13. productsテーブルで最も高い価格(MAX)と最も安い価格(MIN)を同時に取得してください。初級SQL入門 / 集計関数 — COUNT・SUM・AVG・MAX・MIN15pt
  14. productsテーブルを category でグループ化して、カテゴリごとの商品数を取得してください。初級SQL入門 / GROUP BY / HAVING — グループ集計15pt
  15. productsテーブルを category でグループ化して、カテゴリごとの平均価格を取得してください。初級SQL入門 / GROUP BY / HAVING — グループ集計15pt
  16. customersテーブルを city でグループ化して、2人以上いる都市と人数だけを取得してください。初級SQL入門 / GROUP BY / HAVING — グループ集計20pt
  17. orders と customers を JOIN して、注文 id (o.id) と注文した顧客の名前 (c.name) を取得してください。中級中級SQL / JOIN — テーブルの結合20pt
  18. orders・customers・products の 3 テーブルを JOIN して、顧客名・商品名・数量 (quantity) を取得してください。中級中級SQL / JOIN — テーブルの結合20pt
  19. 「田中太郎」が注文した商品の名前を取得してください(JOIN + WHERE)。中級中級SQL / JOIN — テーブルの結合25pt
  20. customers を LEFT JOIN orders で結合し、顧客ごとの注文件数 (COUNT) を「顧客名・件数」で取得してください。中級中級SQL / LEFT JOIN と集計 — 結合してから数える25pt
  21. orders と products を JOIN して、商品ごとの注文合計数量 (SUM(quantity)) を「商品名・合計」で取得してください。中級中級SQL / LEFT JOIN と集計 — 結合してから数える25pt
  22. products の平均価格より高い商品の name と price を取得してください(サブクエリを使う)。中級中級SQL / サブクエリ — クエリの中のクエリ25pt
  23. 「田中太郎」(id = 1) が注文した商品の name を、サブクエリ (IN) を使って取得してください。中級中級SQL / サブクエリ — クエリの中のクエリ25pt
  24. customers の平均年齢より若い顧客の name と age を取得してください(サブクエリを使う)。中級中級SQL / サブクエリ — クエリの中のクエリ20pt
  25. 相関サブクエリを使って、各カテゴリで最も価格の高い商品の name・category・price を取得してください。中級中級SQL / サブクエリ応用 — 相関サブクエリと FROM 句30pt
  26. FROM 句のサブクエリを使って、カテゴリごとの平均価格が 30000 より大きいカテゴリと、その平均価格を取得してください。中級中級SQL / サブクエリ応用 — 相関サブクエリと FROM 句30pt
  27. orders と products を JOIN して、カテゴリ別の売上 (SUM(price × quantity)) を「カテゴリ・売上」で取得してください。中級中級SQL / 総合 — JOIN × GROUP BY で売上を出す30pt
  28. orders と customers を JOIN して、2 回以上注文した顧客の名前と注文回数を取得してください(HAVING を使う)。中級中級SQL / 総合 — JOIN × GROUP BY で売上を出す30pt
  29. 3 テーブルを JOIN して、顧客ごとの購入総額 (SUM(price × quantity)) を「顧客名・総額」で取得してください。中級中級SQL / 総合 — JOIN × GROUP BY で売上を出す30pt
  30. products の name と price に加えて、price が 30000 以上なら '高価格'、5000 以上なら '中価格'、それ以外は '低価格' となる price_band 列を CASE で作り、price の高い順に並べてください。上級上級SQL / CASE — 条件で値を切り替える25pt
  31. カテゴリごとに、商品の総数 total と、price が 30000 以上の商品数 high_count を、条件付き集計 (SUM + CASE) で同時に取得してください。上級上級SQL / CASE — 条件で値を切り替える30pt
  32. products の name と stock に加えて、stock が 20 未満なら '要補充'、100 未満なら '通常'、それ以外は '潤沢' となる stock_level 列を作り、stock の少ない順に並べてください。上級上級SQL / CASE — 条件で値を切り替える25pt
  33. products の name と price に、price の高い順の順位 rnk を RANK() で付けてください。上級上級SQL / ウィンドウ関数 — 順位を付ける25pt
  34. products の category・name・price に、カテゴリごとに price の高い順の順位 rn を ROW_NUMBER() で付けてください (PARTITION BY を使う)。上級上級SQL / ウィンドウ関数 — 順位を付ける30pt
  35. 各カテゴリで最も価格が高い商品だけを、category・name・price の 3 列で取得してください (ウィンドウ関数をサブクエリに包んで絞る)。上級上級SQL / ウィンドウ関数 — 順位を付ける30pt
  36. orders の id・order_date・quantity に、order_date と id の順で並べた quantity の累計 running_total を SUM() OVER で付けてください。上級上級SQL / ウィンドウ関数 — 累計と前後の行30pt
  37. products の name と price に、price の高い順で 1 つ前の行の価格 prev_price を LAG() で付けてください。上級上級SQL / ウィンドウ関数 — 累計と前後の行30pt
  38. products の name・category・price に、同じカテゴリの平均価格との差 diff (price から平均を引いた値) を付けてください。上級上級SQL / ウィンドウ関数 — 累計と前後の行30pt
  39. WITH を使って、まず注文ごとの金額 (price × quantity) を求める CTE を作り、それを顧客ごとに合計した name と total を、total の多い順に取得してください。上級上級SQL / WITH 句 (CTE) — 長いクエリを名前で分解する35pt
  40. WITH でカテゴリごとの平均価格を求める CTE を作り、それを使って「自分のカテゴリの平均価格より高い商品」の name・category・price を取得してください。上級上級SQL / WITH 句 (CTE) — 長いクエリを名前で分解する35pt
  41. CTE を 2 つつなげて、商品ごとの販売数量の合計を求め、name と qty を qty の多い順 (同数なら name 順) で取得してください。上級上級SQL / WITH 句 (CTE) — 長いクエリを名前で分解する30pt
  42. orders を年月ごとにまとめ、ym (YYYY-MM 形式) と注文件数 cnt を、ym の昇順で取得してください。上級上級SQL / 日付の集計と EXISTS30pt
  43. orders と products を結合して、年月ごとの売上金額 (price × quantity の合計) を ym と sales の 2 列で、ym の昇順で取得してください。上級上級SQL / 日付の集計と EXISTS35pt
  44. 東京に住む顧客が一度でも注文した商品の name を、EXISTS を使って name 順に取得してください。上級上級SQL / 日付の集計と EXISTS35pt
  45. daily_sales から月ごとの売上合計を出してください。列は month (2026-01 の形) と sales の 2 つ、月の昇順で並べます。中級実務データ分析SQL / 月次集計 — 日付を年月にまとめる25pt
  46. 月ごと・店舗ごとの売上合計を出してください。列は month・store・sales の 3 つ、month → store の順で並べます。中級実務データ分析SQL / 月次集計 — 日付を年月にまとめる25pt
  47. 月ごとに、売上合計 sales・明細の件数 lines・売上のあった日数 days を出してください。列は month・sales・lines・days、月の昇順です。中級実務データ分析SQL / 月次集計 — 日付を年月にまとめる30pt
  48. 曜日番号ごとの売上合計を出してください。列は w (0〜6 の文字列) と sales、w の昇順で並べます。中級実務データ分析SQL / 曜日別集計 — 合計ではなく平均で比べる25pt
  49. 曜日を日本語 1 文字 (日・月・火・水・木・金・土) にして売上合計を出してください。列は weekday と sales、売上の多い順に並べます。中級実務データ分析SQL / 曜日別集計 — 合計ではなく平均で比べる30pt
  50. 週末 (日・土) と平日に分けて、1 日あたりの売上 per_day を出してください。列は kind と per_day、per_day の多い順です。per_day は ROUND で整数に丸めます。中級実務データ分析SQL / 曜日別集計 — 合計ではなく平均で比べる30pt
  51. daily_sales と products を結合し、カテゴリ別の売上合計を出してください。列は category と sales、売上の多い順です。中級実務データ分析SQL / 構成比 — 全体の何%かを出す25pt
  52. カテゴリ別の売上に、全体に占める割合 pct (小数第 1 位まで) を足してください。列は category・sales・pct、売上の多い順です。中級実務データ分析SQL / 構成比 — 全体の何%かを出す30pt
  53. 店舗ごとに、その店の中でのカテゴリ構成比を出してください。列は store・category・sales・pct、pct は百分率を小数第1位まで丸め、store 昇順 → sales 降順で並べます。中級実務データ分析SQL / 構成比 — 全体の何%かを出す35pt
  54. 日別の売上合計を出してください。列は sale_date と sales、日付の昇順で並べます。上級実務データ分析SQL / 移動平均 — 日々のブレをならす20pt
  55. 日別売上に 7 日移動平均 ma7 を足してください。列は sale_date・sales・ma7、日付の昇順です。ma7 は ROUND で小数第 1 位まで丸めます。上級実務データ分析SQL / 移動平均 — 日々のブレをならす35pt
  56. 日別売上に累計 cum を足してください。列は sale_date・sales・cum、日付の昇順です。最終日の累計が期間全体の合計と一致します。上級実務データ分析SQL / 移動平均 — 日々のブレをならす30pt
  57. 月次売上に前月の値 prev と前月比 mom (%、小数第 1 位) を足してください。列は month・sales・prev・mom、月の昇順です。上級実務データ分析SQL / 前月比と店舗比較 — 縦の並びを横に変える30pt
  58. 月ごとに 1 行で、東京本店の売上 tokyo・大阪支店の売上 osaka・その差 diff (東京 − 大阪) を出してください。列は month・tokyo・osaka・diff、月の昇順です。上級実務データ分析SQL / 前月比と店舗比較 — 縦の並びを横に変える30pt
  59. 店舗ごとの月次売上に、その店舗の中での前月比 mom を足してください。mom は百分率を小数第1位まで丸めます。列は month・store・sales・mom、store 昇順 → month 昇順で並べます。上級実務データ分析SQL / 前月比と店舗比較 — 縦の並びを横に変える40pt
  60. daily_salesを月・店舗・商品ごとの売上合計にし、各月・各店舗の上位3商品をROW_NUMBERで抽出してください。同額はproduct_id昇順。列はmonth・store・product_id・sales・rn、month昇順→store昇順→rn昇順の18行です。上級実務データ分析SQL / SQL店舗別ランキング:上位抽出と同率順位35pt
  61. 2026-03-15の店舗・商品ごとの売上合計に、店舗内の売上降順のRANKとDENSE_RANKを付けて比較してください。同率判定は売上のみ。列はstore・product_id・sales・rnk・dense、store昇順→sales降順→product_id昇順の6行です。上級実務データ分析SQL / SQL店舗別ランキング:上位抽出と同率順位30pt
  62. 2026-03-15の店舗・商品ごとの売上から、店舗別に売上金額の上位2段階を同率込みで抽出してください。列はstore・product_id・sales・dense、store昇順→dense昇順→product_id昇順の5行です。上級実務データ分析SQL / SQL店舗別ランキング:上位抽出と同率順位35pt

問題の並び順について

並び順はコース (SQL入門 → 中級SQL → 上級SQL) の中のレッスン順です。 前から順に解くと、SELECT・WHERE・ORDER BY の基本から、集計と GROUP BY、 JOIN とサブクエリ、ウィンドウ関数と CTE まで積み上がるように並んでいます。 どこから始めても構いませんが、詰まったら 1 つ前のレッスンの解説に戻るのが早道です。

答え合わせは自動です。書いた SQL を実行すると、結果が期待どおりかを判定して 正解なら次の問題に進みます。正解すると模範解答も出るので、自分の書き方と 見比べられます。