首页 > 教程攻略 > ai资讯 >DeepSeek怎么生成SQL语句?

DeepSeek怎么生成SQL语句?

来源:互联网 时间:2026-08-07 12:58:10

你要是不把表结构说清楚,它直接给你编一个字段名出来,能跑才怪。所以,问题的关键就变成了:到底该怎么写提示词,才能让AI一次就输出正确的SQL?

第一步:把表结构原样贴进提示词

在提问开头,先上代码块,把完整的CREATE TABLE语句贴进去。字段名、类型、主键、NOT NULL约束,一个都不能省。比如:

```sql
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, city VARCHAR(30), reg_time DATETIME);
CREATE TABLE orders (order_id INT PRIMARY KEY, user_id INT, amount DECIMAL(10,2), order_time DATE);
```

【orders.user_id → users.id】

这行外键说明必须紧跟着表结构写,否则DeepSeek可能直接用orders.id = users.id做JOIN,结果要么是空集,要么是笛卡尔积。

千万别写“用户表有ID和姓名”这种模糊描述,模型会自己虚构字段名,比如把user_id写成uid或id_user,到时查出来全是错的。

第二步:用三段式指令说清你要什么

把自然语言需求拆成【任务】【输入约束】【输出要求】三块,中间空一行隔开,让AI一眼就能抓住重点。

【任务】
检索2024年5月下单金额超过500元的北京用户姓名、手机号、订单数。

【输入约束】
仅使用users和orders表;时间字段统一用order_time;用户地区以users.city字段为准;users表中手机号字段名为phone。

【输出要求】
只输出一条可执行SELECT语句,不带任何解释、不加```sql标记、不换行、不加注释。

漏掉“不加```sql标记”这条,DeepSeek九成概率会返回带代码块包裹的SQL,复制后还得手动删掉前后三重反引号才能执行,徒增麻烦。

第三步:加一条目标数据库方言声明

方法一:在提示词最开头加一句硬性约束,例如:
“请生成兼容MySQL 8.0的标准SQL,禁止使用ROW_NUMBER()、CTE或LIMIT后跟逗号语法。”

方法二:如果用的是PostgreSQL,就写“所有字段名和表名用双引号包裹,如"users"."name";时间比较用'2024-05-01'::DATE”。

不声明方言,DeepSeek默认按通用ANSI SQL输出,但实际环境可能是MySQL或SQLite——前者不支持FULL OUTER JOIN,后者不支持窗口函数,一执行就报错。

第四步:塞两个真实示例(Few-shot)

① 输入:“查上海用户的平均订单金额” → 输出:SELECT A VG(o.amount) FROM users u JOIN orders o ON u.id = o.user_id WHERE u.city = '上海';

② 输入:“列出每个城市订单数前三的用户姓名” → 输出:SELECT u.name, u.city, COUNT(*) AS cnt FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.city, u.name ORDER BY u.city, cnt DESC LIMIT 3;

这两个例子必须来自同一套表结构,字段名、别名风格、聚合写法完全一致——DeepSeek会照着这个模式仿写,而不是凭空发明别名或函数。