游乐游手机版
首页/AI热点日报/热点详情

DeepSeek如何生成SQL数据库查询语句

类型:热点整理2026-07-08
生成SQL需提供完整表结构及外键关系,采用三段式明确任务、约束与输出要求,声明数据库方言并附带语法模板。生成后检查字段前缀、GROUPBY完整性及时间函数合规性。

要拿DeepSeek生成一条能直接在你数据库里跑起来的SQL查询,关键是得先想清楚一个问题:它根本不连你的数据库,不会自动读表名、字段、外键、时间格式和方言。你给它什么,它就猜什么,缺的东西越多,生成的语句越容易翻车。所以,想少踩坑,建议你养成一个习惯——把下面这一套流程走下来。

第一步:把表结构贴过去,一个字符都不能少

一定得是完整的CREATE TABLE语句。别指望靠口头描述让它猜,比如“users表有个id,还有个name”——这不够,它没法知道字段类型、默认值、时间格式。你得从数据库管理工具里直接复制出来:MySQL用SHOW CREATE TABLE users;,SQLite用.schema users,拿到之后原样贴进提示词,用```sql包裹起来。

举个例子:

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

光贴表结构还不够。核心坑在这里:你必须单独写明外键关系。如果直接丢进去,DeepSeek大概率会给个orders.id = users.id的错误关联。正确的写法是——写上“orders.user_id 引用 users.id”。

第二步:用三段式讲清楚要什么

想法越是模糊,它给出的SQL就越容易翻车。“查活跃用户”这种说法,它根本没法下判断。更好的做法是像这样分三段写:

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

【输入约束】只用到 users 和 orders 表;用户地区看 users.city;时间字段统一是 order_time;orders.user_id 是外键,指向 users.id。

【输出要求】只输出一条可执行的 SELECT 语句,关键字大写,字段加反引号,不带任何解释,不加```sql,不换行。

如果你要写的是嵌套子查询或者多步聚合,可以拆开引导:先让模型列出涉及的表和字段,再写SELECT和FROM,最后补WHERE、GROUP BY和聚合。这样能避免漏掉GROUP BY——MySQL 8.0以上如果缺了它,直接报错。

还有一点,如果输出的结果里带了```sql或者中文注释,说明第二段的约束写得不够硬。记住写上“禁止Markdown、禁止自然语言、禁止空行”。

第三步:贴一句方言语法模板

DeepSeek不会主动猜你用的是什么数据库。“取年份”在MySQL是DATE_FORMAT(order_time, '%Y'),在PostgreSQL必须写EXTRACT(YEAR FROM order_time)。混用就是必错的。

在提示词里加一句话明确声明,“使用 MySQL 8.0 语法,时间字段为 DATETIME 类型,禁止使用窗口函数和CTE”。

接着再贴一个你自己确认可用的样例:

SELECT u.`name`, u.`phone`, COUNT(o.`id`) AS `order_count`
FROM `users` AS u
INNER JOIN `orders` AS o ON u.`id` = o.`user_id`
WHERE YEAR(o.`order_time`) = 2024 AND u.`city` = '北京'
GROUP BY u.`id`, u.`name`, u.`phone`;

然后把你的真实需求放在这段话后面,用“--- 以上为示例,以下为待处理问题:”隔开。

第四步:生成完,立刻盯住三个区域

结果出来后,不需要花时间去找整段错,你把目光集中在三个点上就行。

  • 字段前缀:两个表都有id,SELECT里不能只写id,必须写成u.ido.id。写没写前缀,一眼就看得出来。
  • GROUP BY子句:SELECT里所有非聚合字段,必须在GROUP BY里出现。漏一个,MySQL严格模式就报错。检查一遍你的SELECT列,去掉聚合函数后剩下的字段都得在GROUP BY里。
  • 时间函数:看看能否匹配你声明的方言。MySQL里用YEAR()是合理的,如果冒出来TO_DATE,说明第二步没卡住,重新问。

要是发现字段名写错了——比如把reg_time写成了create_time——那问题出在第一步,你没给对CREATE TABLE。回去核一下。

这一套走完,就可以放心地把SQL复制进数据库客户端直接执行了。

来源:https://www.php.cn/faq/2785844.html?uid=1431639

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。