Cursor擦り倒すシリーズ
- Cursorで要件定義がエラいスムーズになった話
- (続)Cursorで「詳細設計→ガントチャート草稿」作成がめっちゃ楽になった話
- 「Cursor」×「A5:SQL Mk-2」でテーブル定義書をリッチにする
- 「Cursor」×「Obsidian」内部リンク生成&最適化プロンプト
- 「Cursor」で「難解コード」のリーディングがめちゃ楽になった話
- 「Cursorで要件定義をめっちゃ簡単に」を「rules」にしてさらに簡単にした
- 「Cursor」で「素の議事録」を「要件定義書」に高速でまとめなおした話
- 「Cursor」で新人向け「SQLトレーニング問題作成」するプロンプト作成 ←本稿こちら
序 —— そろそろどこまでやるかを考えるようになりました
私がエンジニアリングマネージャとして、そして一介の開発者として日々感じているのは、「道具をどう使うか」ではなく「その道具とどう向き合うか」 という命題です。Cursor というLLM IDE がもたらしてくれるのは、端的に言えば生産性のブーストですが、本質的には 思考のリフレーミング に近い――そう考えています。
つまり、ソースを読むときの“解像度”を強制的に上げ、曖昧な認識を許さない。向き合うとは、そうした「言い逃れできない状況」を自らに課す行為であり、そこにこそ学習と改善の芽が潜んでいるのだろう、と。
まなべ!新人!SQLトレーニングを無限にやってやる!
今回記すのは、Cursorを“擦り倒した”末に辿り着いた一つの再現手順――システム分析からSQLトレーニングプログラムを生成するまでのプロセスです。振り返ってみれば、「障害と向き合う」ときと同じくらい、自分の曖昧さとも格闘する体験でした。
Cursorと“対話”を繰り返すうち、私は――いや、私たち開発組織は――「コードを読むこと」と「教育カリキュラムを設計すること」が地続きであると再発見しました。今回の記事では、その知見を再現可能な手順としてまとめています。
Step 1: 対象モジュールのテーブル参照調査
実行手順
- ソースコード該当箇所の指定
- プロンプト実行
成果物
重要度ランク付きテーブルリスト(S/A/B/Cランク)
プロンプト
[ソースコード該当箇所]で参照されているテーブルの中で、特に優先順位が高いものにグレードを付けて20個ピックアップしてください。
Step 2: テーブルリストの精査・調整
実行手順
- テーブルリストが納得いくものになるまで、除外と追加を繰り返す
成果物
最終確定版テーブルリスト(TOP20)
プロンプト例
[不要なテーブル名] は除外してください。
[追加したいテーブル名] を追加してください。
Step 3: サンプル問題と問題作成プロンプト生成
実行手順
- テーブル定義書ディレクトリを指定
成果物
- 段階別のSQLトレーニング問題作成プロンプト
プロンプト
# SQLトレーニング問題作成プロンプト
## 指示
上記の情報と、テーブル定義一覧から以下を分析し、SQLトレーニングプログラムと各段階の問題生成プロンプトを作成してください:
1. **テーブル構造の分析**
- 各テーブルの主キー、外部キーを特定
- テーブル間の関連性を把握
- カラム名からビジネスドメインを推測
2. **システムの推測**
- テーブル名とカラム構成から、システムの種類を推定
- 主要なエンティティ(ユーザー、商品、注文等)を特定
- 想定されるビジネスフローを推測
3. **段階的トレーニングプログラムと問題生成プロンプトの作成**
### 第1段階:コアテーブルの理解と基礎SQL(1-2週間)
**対象テーブル**: ランクSのテーブルのみ
**学習目標**:
- 最重要テーブルの構造とデータの意味を理解
- SELECT, WHERE, ORDER BY, GROUP BYの基本構文習得
- 単一テーブルでの検索と集計
**第1段階の問題生成プロンプト**:
> 以下のテーブル定義を基に、SQL初学者向けの基礎問題を15問作成してください。
>
> 対象テーブル:
> [ランクSのテーブル]
>
> 問題作成の要件:
> 1. 問題1-3: テーブル構造の確認(DESCRIBE, SELECT * LIMIT)
> 2. 問題4-8: WHERE句の基本(=, >, <, LIKE, IN, BETWEEN, IS NULL)
> 3. 問題9-12: ORDER BYとLIMITの組み合わせ
> 4. 問題13-15: 基本的な集計(COUNT, SUM, AVG)とGROUP BY
>
> 各問題の形式:
> =====================================
> 問題[番号]: [タイトル]
> =====================================
>
> 【問題文】
> [具体的に何を取得・集計するのかを明確に記述。例:「2024年1月以降に登録された東京都在住のアクティブユーザーを、登録日の新しい順に20件取得してください。」]
>
> 【取得項目】
> - [取得するカラム名と説明]
> - [取得するカラム名と説明]
>
> 【条件】
> - [絞り込み条件を箇条書きで明記]
> - [並び順の指定]
> - [件数制限等]
>
> 【学習ポイント】
> [この問題で学ぶSQL構文と概念]
>
> 【解答】
> > [解答となるSQL文]
>
> 【実行結果の例】
> > [結果の簡単なサンプル(3-5行程度)]
> =====================================
### 第2段階:トランザクションテーブルとの結合(2-3週間)
**対象テーブル**: ランクS + ランクA
**学習目標**:
- 外部キーを使ったテーブル結合の理解
- マスターデータとトランザクションデータの関係把握
- 複数テーブルを跨いだ集計
**第2段階の問題生成プロンプト**:
> 以下のテーブル定義を基に、テーブル結合を学ぶ問題を20問作成してください。
>
> 対象テーブル:
> [ランクSとランクAのテーブル]
>
> テーブル間の関連:
> [外部キー関係を明記]
>
> 問題作成の要件:
> 1. 問題1-5: INNER JOINの基礎(2テーブル結合)
> 2. 問題6-10: LEFT JOINの活用(全件取得パターン)
> 3. 問題11-15: 3つ以上のテーブル結合
> 4. 問題16-20: JOINとGROUP BYの組み合わせ集計
>
> 各問題の形式:
> =====================================
> 問題[番号]: [タイトル]
> =====================================
>
> 【問題文】
> [具体的なビジネス要件を記述。例:「2024年1月の注文データについて、注文したユーザーの名前と注文金額を含む一覧を作成してください。キャンセルされた注文は除外し、注文金額の高い順に表示してください。」]
>
> 【取得項目】
> - [テーブル名.カラム名]: [説明]
> - [テーブル名.カラム名]: [説明]
>
> 【結合条件】
> - [テーブル1]と[テーブル2]を[カラム名]で結合
>
> 【絞り込み条件】
> - [具体的な条件]
>
> 【学習ポイント】
> [JOIN種別の選択理由、結合キーの理解]
>
> 【解答】
> > [解答となるSQL文(結合部分にコメント付き)]
>
> 【結合のポイント】
> [なぜこのJOIN種別を選んだか、結果にどう影響するか]
> =====================================
### 第3段階:詳細データの分析(3-4週間)
**対象テーブル**: ランクS + ランクA + ランクB
**学習目標**:
- サブクエリとCTEを使った複雑なクエリ作成
- CASE文による条件分岐
- 日付関数を使った時系列分析
**第3段階の問題生成プロンプト**:
> 以下のテーブル定義を基に、実践的な分析問題を20問作成してください。
>
> 対象テーブル:
> [ランクS、A、Bのテーブル]
>
> 問題作成の要件:
> 1. 問題1-5: サブクエリ(WHERE句、FROM句での使用)
> 2. 問題6-10: WITH句(CTE)を使った段階的な集計
> 3. 問題11-15: CASE文とGROUP BYの組み合わせ
> 4. 問題16-20: 日付関数と時系列分析
>
> 各問題の形式:
> =====================================
> 問題[番号]: [タイトル]
> =====================================
>
> 【問題文】
> [分析の背景と要求を具体的に記述。例:「マーケティング部門から、ユーザーの購買行動を分析したいという要望がありました。過去3ヶ月間で2回以上購入したユーザーを『リピーター』、1回のみを『新規』として分類し、それぞれの人数と売上貢献度を月別に集計してください。」]
>
> 【分析要件】
> - [何を明らかにしたいか]
> - [どのような切り口で分析するか]
> - [アウトプットの形式]
>
> 【必要なテクニック】
> - [使用する関数や構文]
> - [データ加工の方法]
>
> 【学習ポイント】
> [サブクエリ/CTE/CASE文の実践的な使い方]
>
> 【解答】
> > -- ステップごとにコメントを記載
> > [解答となるSQL文]
>
> 【解説】
> [クエリの構造と各部分の役割を詳細に説明]
>
> 【発展課題】
> [この分析を基にした追加の問題]
> =====================================
### 第4段階:高度な分析と最適化(4-5週間)
**対象テーブル**: 全テーブル(ランクS〜C)
**学習目標**:
- ウィンドウ関数による高度な分析
- クエリパフォーマンスの最適化
- システム全体を俯瞰した総合分析
**第4段階の問題生成プロンプト**:
> 以下のテーブル定義を基に、高度な分析問題を15問作成してください。
>
> 対象テーブル:
> [全テーブル]
>
> 問題作成の要件:
> 1. 問題1-5: ウィンドウ関数(ROW_NUMBER, RANK, LAG/LEAD)
> 2. 問題6-8: ウィンドウ関数での集計(SUM/AVG OVER)
> 3. 問題9-11: 複数CTEを組み合わせた複雑な分析
> 4. 問題12-13: EXPLAINとパフォーマンス最適化
> 5. 問題14-15: 総合演習(全テーブルを活用した分析)
>
> 各問題の形式:
> =====================================
> 問題[番号]: [タイトル]
> 難易度: [★★★★☆]
> =====================================
>
> 【問題文】
> [複雑なビジネス要件を記述。例:「経営層から四半期レビューのために、以下の分析を依頼されました。商品カテゴリ別の売上推移を前四半期と比較し、成長率でランキングを作成してください。さらに、各カテゴリ内での商品別売上ランキングも併せて表示し、上位3商品については前期からの順位変動も示してください。」]
>
> 【要求される分析】
> 1. [主要な分析内容]
> 2. [付随する詳細分析]
> 3. [アウトプットの形式と項目]
>
> 【制約条件】
> - [パフォーマンス要件]
> - [データの整合性確保]
>
> 【ビジネス価値】
> [この分析がもたらす洞察と活用方法]
>
> 【学習ポイント】
> [ウィンドウ関数の高度な使い方、最適化のポイント]
>
> 【解答】
> > -- 詳細なコメントで各部分を説明
> > [解答となるSQL文]
>
> 【パフォーマンス考慮点】
> - [インデックスの活用方法]
> - [実行計画の読み方と改善点]
>
> 【別解】
> > [同じ結果を得る別のアプローチ]
>
> 【実務での応用】
> [この技術を使った他の分析シナリオ]
> =====================================
## 出力形式
各段階について以下を出力してください:
1. **段階の概要**
- 対象テーブルとその関係性
- 学習目標と到達レベル
- 推定学習期間
2. **問題生成プロンプト**
- 上記のフォーマットに従った具体的なプロンプト
- テーブル定義の該当部分を含める
3. **サンプル問題**
- 各段階から代表的な問題を2-3問例示
- 明確な問題文、解答SQL、解説を含める
4. **学習のポイント**
- その段階で特に注意すべき点
- よくある間違いと対策
このプロンプトに従って、提供されたテーブル定義とランク情報から、体系的なSQLトレーニングプログラムと各段階の問題生成プロンプトを作成してください。
余談 —— 「向き合う」は終わらない
「Cursorを擦り倒す」行為は、端的には “自らの無知を可視化する” ことに他なりません。私はそれを痛みと呼びたくもなりますが、同時にそこには成長の可処分領域が広がっている――そうも感じています。
SRE も EM も、ひいては不動産テックの現場も、「一度決めておしまい」という局面はほとんど存在しません。だからこそ、“再現手順” を外部化し、共有し、改善サイクルを回すことに意味がある。
本稿が、読者――いや、次にSQL教育に向き合う誰か――のコンパスになれば幸いです。
「学びとは終わりなき障害対応である。(言いたいだけ)」