Text To Sql — 文本到SQL
v1在以下情况使用:(1)用户用简单的英语描述他们想要的数据,并要求对应的SQL查询。(2)用户说“为此写SQL”,“转换为查询”,“我如何选择”,或“给我SQL”。(3)用户提供数据库模式或表描述,并提出可以用SQL回答的问题。
运行时依赖
安装命令
点击复制技能文档
Text to SQL 何时使用: (1) 用户用简单的英语描述他们想要的数据并要求相应的 SQL 查询。 (2) 用户说“写 SQL 查询”,“转换为查询”,“如何选择”,或“给我 SQL”。 (3) 用户提供数据库模式或表描述并要求一个可以用 SQL 解决的问题。 核心职责 这个技能解决了非技术用户无法将他们的意图转换为 SQL 查询的问题——他们需要一个从自然语言到查询的桥梁。 这个技能不是: 一个 SQL 执行环境——它编写查询,而不是运行它们 一个模式设计工具——它使用用户提供的现有模式 一个数据分析工具——它生成 SQL 查询,而不是结果或见解 这个技能仅在以下情况下激活: 自然语言描述 + 数据库模式 + SQL 请求都存在。 模式 /text-to-sql 默认模式。将自然语言转换为语法正确的 SQL 查询。 何时使用:用户描述数据需求并提供模式——想要查询。 /text-to-sql/explain 输出带有内联注释的 SQL 查询,以解释每个子句。 何时使用:用户想要在学习过程中理解查询。 /text-to-sql/alternatives 提供 2-3 个替代查询方法(不同的 JOIN、子查询与 CTE 等)。 何时使用:用户正在学习 SQL 或想要比较查询策略。 执行步骤 步骤 1 — 确认模式 接收自然语言请求并检测模式是否存在 模式可能以以下形式提供: 表/列名在请求中显式提供 CREATE TABLE 语句 DESCRIBE 输出 来自之前查询的列名 如果模式未提供,要求用户提供模式,然后再继续——不要猜测表或列名 构建模式映射:表名 → {列:类型} 步骤 2 — 将意图转换为 SQL 子句 将自然语言意图映射到 SQL 组件: 自然语言 SQL 子句 “所有”,“每个”,“完整列表” SELECT 或 SELECT 所有列 “仅”,“仅仅”,“具体” SELECT [具体列] “where [条件]” WHERE 子句 “排序”,“按顺序” ORDER BY “分组”,“每个 [X]” GROUP BY “前 N”,“第一个 N”,“N 个最” LIMIT N + ORDER BY “不”,“排除”,“不包括” WHERE NOT 或 != / <> “X 和 Y”,“以及” WHERE 中的 AND 或 JOIN “X 或 Y”,“或” WHERE 中的 OR “介于 X 和 Y 之间” BETWEEN “类似”,“包含”,“包括” LIKE '%值%' “之前”,“之后”,“早于” WHERE date_column < '日期' “最新”,“最近”,“最新” ORDER BY date DESC LIMIT 1 “数量”,“多少” COUNT() 聚合 “总和”,“总计” SUM(列) “平均值” AVG(列) 步骤 3 — 处理 JOIN 和关系 如果请求涉及多个表: 确定哪些表包含所需列 确定 JOIN 键(外键关系) 选择 JOIN 类型:INNER JOIN(默认)、LEFT JOIN(如果某一侧可能为空)、RIGHT JOIN(罕见) 在正确的键对上写 JOIN 如果模式不包含关系信息,要求用户澄清哪个列链接表。 步骤 4 — 生成和验证 SELECT o.order_id, o.created_at, c.customer_name, SUM(o.total_amount) AS total_revenue FROM orders o INNER JOIN customers c ON o.customer_id = c.id WHERE o.created_at >= '2024-01-01' GROUP BY o.order_id, o.created_at, c.customer_name ORDER BY total_revenue DESC LIMIT 10; 检查: 所有引用的列都存在于模式中 所有表别名都已定义 JOIN 条件有效(相同类型,正确键) 没有模糊的列引用(所有表都有别名) 聚合查询具有适当的 GROUP BY 强制规则 不要 不要发明不在提供的模式中的表名或列名 不要将 SQL 关键字用作列名而不加反引号 不要在生产查询中写 SELECT — 列出具体列 不要假设哪个表包含哪个列 — 使用表别名 请 在编写查询之前询问模式信息(如果未提供) 使用表别名(例如 o.order_id) 如果列名是 SQL 保留字,请使用反引号或引号标识符 提供查询和一行简单的英语翻译 质量标准 良好的输出: 查询在指定方言(PostgreSQL、MySQL、SQLite 等)中语法正确 所有列和表名与提供的模式完全匹配 JOIN 条件有效且使用正确的键类型 查询实际上回答了提出的问题 糟糕的输出: 引用不在模式中的列 没有正当理由在查询中使用 SELECT 缺少聚合查询的 GROUP BY JOIN 不匹配类型(字符串 ID 到整数 ID) 好与坏的例子 场景 坏输出 良输出 模式:users(id, name), orders(user_id, total) SELECT * FROM orders SELECT u.name, SUM(o.total) FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.name “前 10 名客户” 没有 LIMIT 10 或 ORDER BY ORDER BY total DESC LIMIT 10 没有模式提供