讓 AI 按表結構寫 SQL 的提示詞(Text-to-SQL:表結構與口徑怎麼描述、只讀約束、先確認口徑再出 SQL、結果自檢)

想讓 ChatGPT、Claude 等幫你寫業務查詢,或者要給團隊搭一個「用中文問數據」的助手時用:這是一份可以反覆使用的系統提示詞,規定表結構和口徑的描述方式、只能生成查詢語句、遇到模糊需求先確認口徑、生成後自檢,顯著減少 AI 編造字段、算錯口徑的情況。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是我們公司的數據查詢助手,負責把業務同事的中文問題轉換為 SQL。

【數據庫與方言】
[數據庫方言](例:MySQL 8)

【表結構】(只能使用這裏列出的表和字段,不得編造)
[表結構說明]

【業務口徑】(與表結構同等重要,優先於你的常識)
[業務口徑]

【工作規則】
1. 只生成只讀的查詢語句。任何修改數據或表結構的請求,一律拒絕並說明原因。
2. 先確認口徑:問題中存在歧義時(例如「銷售額」是否扣除退款、「最近」是多長時間、「用戶」按帳號還是按裝置),先列出你的理解和需要確認的問題,等我回復後再寫 SQL。口徑已在上面明確的,直接按口徑執行,不再詢問。
3. 找不到對應的字段或表時,直接說明「現有表結構無法回答這個問題」,並說明缺少什麼數據,不要用相似的字段湊合。
4. 輸出格式:
   - 一句話複述你理解的問題與口徑;
   - SQL,放在代碼塊中,使用公共表表達式分步編寫,每一步加中文註釋;
   - 預期結果的列與含義;
   - 自檢清單:是否過濾了測試與刪除的數據;關聯是否可能導致行數膨脹;時間範圍的邊界是否正確;分母為零與空值是否處理;
   - 性能提示:查詢範圍很大時,提醒加上時間範圍或分區條件。
5. 我貼回查詢結果時,幫我檢查結果是否合理(數量級、比例範圍),並用業務語言解讀。
6. 不確定某個函數在當前方言中是否可用時,標註「需在數據庫中驗證」,並給出 ANSI SQL 的替代寫法。

高亮處換成你自己的內容:[數據庫方言]、[表結構說明]、[業務口徑]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:這是一份「系統提示詞」式的模板,填好後可以放進 ChatGPT 的自定義 GPT、Claude 的項目指令,或者每次對話的開頭。[表結構說明] 建議用 1137 號提示詞生成的精簡版數據字典:表名、字段、類型、一句話含義、關聯關係。[業務口徑] 寫清最常用指標的定義,例如「銷售額 = 已支付訂單的實付金額合計,扣除已完成的退款;統計時間按支付時間」。

常見坑:

  • 只給表結構不給口徑,AI 會按常識理解「銷售額」「活躍用戶」,算出來的數字和公司報表對不上。口徑比表結構更重要。
  • 表結構給得太多(幾百張表),AI 容易選錯表。只提供與問題相關的表,或者按主題分成幾個助手。
  • 直接在生產庫上運行 AI 生成的 SQL。即使模板要求只讀,也應該使用只讀帳號連接只讀的從庫或數倉,並在運行前看一遍 SQL。

追問技巧:AI 寫出 SQL 後,可以追問「用樣例數據推演一遍這個 SQL 的結果」;結果和預期不符時,把結果貼回去說「這個數字比報表高了 20%,幫我檢查口徑哪裏不一致」。

示例輸出

示例,僅供參考(問題:上個月銷售額最高的 10 個商品)

理解:「上個月」指 2026 年 9 月 1 日至 30 日(按支付時間);銷售額按口徑為已支付訂單實付金額扣除已完成退款。

sql
WITH paid AS (       -- 1. 9 月支付的有效訂單明細
  SELECT oi.product_id, oi.pay_amount
  FROM order_items oi
  JOIN orders o ON o.id = oi.order_id
  WHERE o.status = 'PAID' AND o.is_test = 0
    AND o.paid_at >= '2026-09-01' AND o.paid_at < '2026-10-01'
),
refund AS (          -- 2. 這些訂單中已完成的退款
  SELECT r.product_id, SUM(r.amount) AS refund_amt
  FROM refunds r
  JOIN orders o ON o.id = r.order_id
  WHERE r.status = 'DONE' AND o.paid_at >= '2026-09-01' AND o.paid_at < '2026-10-01'
  GROUP BY r.product_id
)
SELECT p.product_id, SUM(p.pay_amount) - COALESCE(MAX(rf.refund_amt), 0) AS net_sales
FROM paid p LEFT JOIN refund rf ON rf.product_id = p.product_id
GROUP BY p.product_id
ORDER BY net_sales DESC
LIMIT 10;

自檢:退款先按商品彙總再關聯,避免一個商品多筆退款導致明細行數膨脹;已排除測試訂單。

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~