SQL 練習問題 44

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

全 44 問

  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 — 長いクエリを名前で分解する35pt
  40. WITH でカテゴリごとの平均価格を求める CTE を作り、それを使って「自分のカテゴリの平均価格より高い商品」の name・category・price を取得してください。上級上級SQL / WITH — 長いクエリを名前で分解する35pt
  41. CTE を 2 つつなげて、商品ごとの販売数量の合計を求め、name と qty を qty の多い順 (同数なら name 順) で取得してください。上級上級SQL / WITH — 長いクエリを名前で分解する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

問題の並び順について

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

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