要让DeepSeek生成一条能直接在MySQL里执行、不报错、结果也对的SQL语句,关键不在于它有多聪明,而在于你给的信息够不够死。表结构、字段含义、外键怎么连、时间怎么写、甚至用哪个数据库——这些都得提前说清楚。它不会猜,也不会去查你的库。少一个关键信息,就可能返回Unknown column 'create_time'这种让人头疼的错误。

下面这几个步骤,是经过大量实战验证的套路。照着做,准确率能翻倍。
第一步:把表结构和外键关系原样贴进去
在提问最开头,用代码块格式直接粘贴 CREATE TABLE 语句,必须包含主键、字段类型、NOT NULL 约束。举个例子:
CREATE TABLE users (id BIGINT PRIMARY KEY, name VARCHAR(50) NOT NULL, phone VARCHAR(20), city VARCHAR(30), reg_time DATETIME);
CREATE TABLE orders (order_id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, amount DECIMAL(10,2), order_time DATETIME NOT NULL);
紧接着另起一行,明确写出外键路径:【orders.user_id → users.id】。这一步漏掉,DeepSeek 可能默认用 orders.id = users.id 去 JOIN,一执行就查不到数据。
注意:别写“用户表和订单表有关联”这种模糊描述——它不知道谁引用谁,也不知道是一对多还是多对一。外键关系必须精确到字段级别。
第二步:用三段式指令把需求钉死
把自然语言请求拆成三块:【任务】、【输入约束】、【输出要求】。中间空一行,顺序不能乱。来看一个实际案例:
【任务】
检索2024年5月下单总金额超过5000元的北京用户姓名、手机号、订单笔数、平均订单金额
【输入约束】
仅使用 users 和 orders 表;时间范围以 orders.order_time 为准;用户地区由 users.city 字段判断;订单金额单位为元,保留两位小数
【输出要求】
只输出一条可执行 SELECT 语句;不带任何解释、不加 ```sql 标记、不换行;所有字段名用表别名前缀(如 u.name),禁止裸写 name 或 id
这里有个实际教训:如果没写“不加 ```sql 标记”,DeepSeek 大概率返回带代码块包裹的 SQL。复制进 Na vicat 就会报语法错误——多一个反引号都不行。
第三步:指定数据库方言并嵌入示例
方法一:在提示词开头直接声明
“请生成适用于 MySQL 8.0 的标准 SQL,使用 DATE_FORMAT(order_time, '%Y-%m') 提取年月,分页用 LIMIT 20 OFFSET 0”
方法二:插入一个少样本示例(推荐用于复杂聚合或 JOIN 场景)
输入:“查询上海用户的订单总数和总消费额”
输出:SELECT u.name, COUNT(o.order_id) AS order_count, COALESCE(SUM(o.amount), 0) AS total_amount FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.city = '上海' GROUP BY u.id, u.name;
这个示例必须真实可用,字段名、表别名、函数写法都要和你要生成的 SQL 保持一致。DeepSeek 会按这个风格继续生成,而不是自己发挥。说白了,给它一个“样板”,它就能照着画葫芦。
第四步:检查三个致命陷阱
① 时间写法是否匹配方言:
MySQL 用 DATE_FORMAT(order_time, '%Y-%m'),PostgreSQL 用 TO_CHAR(order_time, 'YYYY-MM'),SQL Server 用 FORMAT(order_time, 'yyyy-MM')。混用必报错,没有例外。
② 字段歧义是否消除:
users.id 和 orders.id 都存在时,必须写成 u.id 和 o.id,不能只写 id —— DeepSeek 有时会漏加别名,导致 MySQL 8.0+ 报错 “Column 'id' in field list is ambiguous”。
③ GROUP BY 是否完整:
SELECT 后出现的非聚合字段(如 u.name、u.phone),必须全部出现在 GROUP BY 子句中。DeepSeek 偶尔会漏掉 u.phone,执行时报错 “Expression #3 of SELECT list is not in GROUP BY clause”。
从数据来看,这三大陷阱占了SQL生成错误的八成以上。每次拿到结果后,先扫一眼这三处,基本就能避免翻车。
