必须提供完整表结构、明确外键路径、三段式任务指令、指定数据库方言及示例SQL,缺一不可,否则DeepSeek生成的SQL易因字段误配、语法错误或逻辑缺失而失败。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要用DeepSeek生成一条能直接执行、不报错、结果正确的SQL语句,你得先绕过它“不会猜”的硬伤——它看不见你的数据库,不认得你表里有没有user_id字段,更不会主动把create_time替换成你实际用的reg_time。你必须把表结构、关联逻辑、字段含义、数据库方言全塞进去,缺一不可。
第一步:把表结构原样贴给DeepSeek
在提问最开头,用代码块格式粘贴完整的CREATE TABLE语句。比如你有两张表:
```sql
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), phone VARCHAR(20), city VARCHAR(30), reg_time DATETIME);
CREATE TABLE orders (order_id INT PRIMARY KEY, user_id INT, amount DECIMAL(10,2), order_time DATETIME);
```
紧接着写明外键路径:【orders.user_id → users.id】。这一步漏掉,DeepSeek大概率会写出orders.id = users.id这种明显错配的JOIN条件。
别写“用户表和订单表有关联”这种模糊描述,它无法推断出哪列连哪列。
第二步:用三段式指令说清你要什么
把自然语言需求拆成【任务】【输入约束】【输出要求】三个模块,中间空一行。
【任务】
检索2024年5月下单金额超过500元的北京用户姓名、手机号、订单数。
【输入约束】
仅使用users和orders表;时间字段统一用order_time;用户地区以users.city字段为准;订单金额阈值为500元(含);时间范围是'2024-05-01'到'2024-05-31'(含首尾)。
【输出要求】
只输出一条可执行的SELECT语句,不带任何解释、不加```sql标记、不换行、关键字大写、字段名小写、不使用别名缩写(如必须写users.name,不能只写name)。
第三步:指定数据库方言并锁死格式
方法一:在问题最开头直接声明
“使用MySQL 8.0语法,时间函数用DATE(order_time),禁止使用EXTRACT或TO_CHAR。”
方法二:在VS Code插件中提前配置
打开设置→搜索deepseek-coder.sql.dialect→设为"mysql"。这比每次提问都重复声明更省事,也避免遗漏。
方法三:手动提交给Ollama本地模型时
第一句话就写:“目标数据库是PostgreSQL 15,请用标准ANSI SQL-92兼容语法,日期范围用order_time >= '2024-05-01' AND order_time 。”
【注意:同一个查询需求,MySQL用DATE_FORMAT(order_time, '%Y'),PostgreSQL必须用EXTRACT(YEAR FROM order_time),混用必报错】
第四步:加一个少样本示例(可选但强烈建议)
① 输入:“查每个城市的用户数和总订单金额”
输出:SELECT u.city, COUNT(DISTINCT u.id) AS user_count, COALESCE(SUM(o.amount), 0) AS total_amount FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.city;
② 输入:“列出2024年下单次数≥3次的用户ID、姓名、最近一次下单时间”
输出:SELECT u.id, u.name, MAX(o.order_time) AS last_order_time FROM users u INNER JOIN orders o ON u.id = o.user_id WHERE o.order_time >= '2024-01-01' GROUP BY u.id, u.name HAVING COUNT(o.order_id) >= 3;
这两个例子能帮DeepSeek理解你想要的字段写法、JOIN类型、聚合逻辑和NULL处理方式。没有示例时,它可能漏掉COALESCE或误用INNER JOIN导致数据丢失。











