Text To Sql — 文本到SQL
v4.0.0当以下情况时使用:(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子句 “按 [列] 排序”,“按 [列] 顺序” 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和关系 如果请求涉及多个表: 确定哪些表包含所需列 确定连接键(外键关系) 选择连接类型:INNER JOIN(默认),LEFT JOIN(如果某一侧可能为空),RIGHT 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 没有模式提供