Text To Sql — 文本转SQL
v1.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”,“以及” AND在WHERE中,或JOIN “X或Y”,“或” OR在WHERE中 “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 没有模式提供