关于 query-builder
Query Builder 是一项将自然语言数据问题转为 SQL 的技能,面向需要按数据库结构查询和汇总数据的用户。它先检查表与列,再生成并执行查询,并包含探索查询的安全规则。
主要功能
- 01将自然语言条件映射为 SQL
- 02先检查表结构与列类型
- 03生成筛选、连接和聚合查询
- 04提供 PostgreSQL、MySQL、SQLite 日期写法
- 05限制探索查询并避免未经请求的写操作
适用场景
- 01查找指定时间段注册的用户
- 02按销售额排名产品或客户
- 03统计每位客户的订单数
- 04按库存或金额条件筛选记录
MCP 相关
该技能示例使用 WhoDB 的 `whodb_tables`、`whodb_columns` 和 `whodb_query` 工具;输入未说明其他 MCP 配置。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ clidey/ whodb --skill query-builder安装后在 Claude Code 中输入/query-builder确认已加载。
详细介绍
查询构建器
使用数据库架构将自然语言问题转换为 SQL 查询。
使用时机
在用户提出以下问题时启用:
- “显示上个月注册的所有用户”
- “查找金额超过 100 美元的订单”
- “哪些产品的库存较低?”
- “按总消费额列出前 10 位客户”
工作流
1. 了解架构
生成 SQL 之前,务必先检查表结构:
whodb_tables(connection="...") → Get available tables
whodb_columns(table="relevant_table") → Get column names and types
2. 确定意图
解析自然语言请求:
- 主体:涉及什么实体?(用户、订单、产品)
- 筛选条件:有哪些条件?(上个月、> 100 美元、活跃)
- 聚合:计数、求和、平均值、最大值、最小值?
- 分组:按什么维度分组?
- 排序:按什么排序?升序还是降序?
- 限制:返回多少条结果?
3. 映射到架构
- 将实体与表名匹配
- 将属性与列名匹配
- 确定所需的外键连接
4. 生成 SQL
遵循 SQL 最佳实践构建查询:
SELECT columns
FROM table
[JOIN other_table ON condition]
WHERE filters
[GROUP BY columns]
[HAVING aggregate_condition]
ORDER BY column [ASC|DESC]
LIMIT n;
5. 执行并呈现
whodb_query(query="generated SQL")
转换模式
| 自然语言 | SQL 模式 |
|---|---|
| “上周/上个月/去年” | WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK) |
| “超过 X” | WHERE col > X |
| “前 N 名” | ORDER BY col DESC LIMIT N |
| “多少” | SELECT COUNT(*) |
| “总计”/“总和” | SELECT SUM(col) |
| “平均值” | SELECT AVG(col) |
| “每个”/“按” | GROUP BY col |
| “介于 X 和 Y 之间” | WHERE col BETWEEN X AND Y |
| “包含”/“类似” | WHERE col LIKE '%term%' |
| “以……开头” | WHERE col LIKE 'term%' |
| “为空”/“是 null” | WHERE col IS NULL |
| “不为空” | WHERE col IS NOT NULL |
按数据库处理日期
PostgreSQL
WHERE created_at >= NOW() - INTERVAL '7 days'
WHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)
MySQL
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
SQLite
WHERE created_at >= DATE('now', '-7 days')
WHERE created_at >= DATE('now', 'start of month')
示例
“显示本月注册的用户”
SELECT * FROM users
WHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)
ORDER BY created_at DESC;
“查找销量最高的前 5 种产品”
SELECT p.name, SUM(oi.quantity) as total_sold
FROM products p
JOIN order_items oi ON p.id = oi.product_id
GROUP BY p.id, p.name
ORDER BY total_sold DESC
LIMIT 5;
“每位客户有多少订单?”
SELECT customer_id, COUNT(*) as order_count
FROM orders
GROUP BY customer_id
ORDER BY order_count DESC;
安全规则
- 探索性查询始终使用 LIMIT(默认值:100)
- 除非用户明确要求,否则绝不生成 DELETE、UPDATE 或 DROP
- 如果查询可能返回大量结果,请发出警告
- 在 JOIN 中使用表别名以提升可读性
评论
支持 Markdown