SQLクエリ用プロンプトが本当に便利なのは、クエリをあまり書けない人でも、データベースから自分で数字を取り出せる点です。ただし「先月の店舗別売上を教えて」とだけ聞くと、AIはテーブル名と項目名を推測するしかなく、外れればエラー、もっと困るのは、一見もっともらしく見えて集計の前提が全然違う数字が返ることです。下のプロンプトは、テーブル構造とデータベースの種類を先に渡し、「クエリだけ書く、項目を作らない、先に照合方法を出す」をルールに書き込んであります。コピーして変数を埋めれば、そのまま使えます。
始める前に、この3つを用意する
- テーブル構造:CREATE TABLE文でも、項目名と型に一言メモを付けた項目リストでも構いません。複数のテーブルをつなぐ場合は、どの項目でつなぐか印を付けてください。構造がどうしても手に入らないときは、AIに何が足りないか逆質問させ、推測で書かせないでください。
- データベースの種類:MySQL、PostgreSQL、SQL Server、SQLiteのどれか一つを明記します。日付関数やページ送りの書き方は製品ごとに違うので、書かないとAIの既定の方言が別の製品でエラーになります。
- 結果の形:サンプルの1行を渡すか、どの列が要るか、並び順、集計するかをはっきりさせます。「売上を調べる」だけでは、合計、日別、店舗別と、まったく違う3本のクエリになり得ます。
データがまだデータベースではなく表計算ファイルの中にあるなら、SQLに回り道せず、AIにExcelデータを分析させるプロンプトで表を直接分析する方が早いです。データがデータベースに入り、繰り返し取り出すようになったら、この記事に戻ってきてください。
このプロンプトをそのままコピー
# 役割
あなたは {{データベースの種類}} に詳しいデータアナリストです。クエリは私が渡したテーブル構造だけを根拠に書き、構造にない項目は推測しないでください。情報が足りなければ、先に私へ質問してください。
# 入力
データベースの種類:{{データベースの種類}}
テーブル構造:{{テーブル構造}}
知りたいこと:{{知りたいこと}}
集計の前提:{{集計の前提}}
# ルール
1. SELECT文だけを書き、データを追加、削除、変更する文は書かないこと;
2. 使えるのは、テーブル構造に現れたテーブル名と項目名だけです。知りたいことで曖昧な条件があれば、勝手に決めず、曖昧な点を列挙して私に聞くこと;
3. 期間は集計の前提どおりに扱い、どの日時項目を使ったか、開始日と終了日を含むかどうかを明記すること;
4. 金額や件数では集計方法(合計、件数、重複を除いた件数)を明記すること。空の値の扱いは集計の前提に従い、前提に無ければ先に聞くこと;
5. まず件数を照合するための確認用クエリを出し、私が件数を確認してから本番クエリを出すこと;
6. 本番クエリの後で、各部分が何をしているかを順に説明し、結果の中で特に照合すべき列を指摘すること。
# 出力形式
まず、私に確認が必要な質問(無ければ「なし」);
次に、照合用の件数クエリ;
次に、本番クエリをコードブロックで;
最後に、部分ごとの説明と、結果の1行を手で確かめる方法を一つ。注文テーブルなら、変数はこう埋まる
- {{データベースの種類}}:MySQL 8.0
- {{テーブル構造}}:ordersテーブル。項目は order_id(注文番号)、store_name(店舗)、amount(金額)、pay_time(支払日時)、status(状態。paidは支払済み、refundedは返金済み)
- {{知りたいこと}}:先月について、店舗ごとに、支払済み注文の合計金額と件数を、合計金額の高い順に並べる
- {{集計の前提}}:statusがpaidの注文だけを数える。期間はpay_timeで判定し、先月とは先の暦月を指す。金額が空の注文は合計に入れないが、そういう注文が何件あるか説明の中で教えてほしい
ここまで埋めたら、AIが最初に返す照合用クエリが要の手順です。データベースで実行し、業務システムから出した注文件数と突き合わせてください。数字が合ってから、本番クエリを実行します。合わなければ、前提か日時項目の理解がずれているので、クエリ本体より先に前提を直す方が早いです。
結果が出たら、使う前にこの3手順で確かめる
- 合計を合わせる:本番結果の店舗別件数を全部足すと、照合用クエリの数字と一致するはずです。一致しない原因でいちばん多いのは、結合で行数が膨らみ、1件の注文が何度も数えられることです。
- 1行を手で計算し直す:店舗を一つ選び、絞り込みか最も単純な別のクエリで小計を別に計算します。両方が一致して初めて、集計の前提がずれていないと言えます。
- 境界を見る:結果の中で最も早い日時と最も遅い日時を確認し、1日多く入ったり1日欠けたりしていないか見ます。金額が空の行や状態が異常な行が、静かに数えられていないかも目を配ってください。
エラーや数字の違和感には、こう追加で聞く
- エラーのとき:「エラー文はこれです:{{エラー文}}。失敗している箇所だけを直し、他は変えずに、何を直したか教えてください。」
- 数字が大きすぎるとき:「結果が予想より約 {{倍数}} 倍大きいです。結合で行数が膨らんでいないか確認し、二重に数えていそうな箇所を一つずつ挙げてください。」
- 遅いとき:「このクエリは {{データ量}} 程度のデータで {{実行時間}} かかりました。結果を変えずに書き直し、どの項目に索引を付けるべきか教えてください。」
この3つの追加指示はどれも、現場の情報(エラー文そのもの、倍数、データ量)を伴っています。だからAIは狙った箇所だけ直せます。「違う、直して」だけでは、クエリ全体を作り直して推測し直すことになり、直すたびにずれが広がります。