mcpField
Q
query-builder

query-builder

github.com/clidey数据与数据库5.0k101 次安装今天更新
代码仓库

关于 query-builder

Query Builder 是一项将自然语言数据问题转为 SQL 的技能,面向需要按数据库结构查询和汇总数据的用户。它先检查表与列,再生成并执行查询,并包含探索查询的安全规则。

主要功能

  1. 01将自然语言条件映射为 SQL
  2. 02先检查表结构与列类型
  3. 03生成筛选、连接和聚合查询
  4. 04提供 PostgreSQL、MySQL、SQLite 日期写法
  5. 05限制探索查询并避免未经请求的写操作

适用场景

  1. 01查找指定时间段注册的用户
  2. 02按销售额排名产品或客户
  3. 03统计每位客户的订单数
  4. 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