可视化 SQL 查询生成工具,专为 HIS 系统复杂多表查询设计。医护人员点点鼠标就能生成正确的 SQL,不用记表名和字段。
| 类别 | 功能 |
|---|---|
| 📊 数据字典 | Excel 导入/导出、JSON 粘贴、自动保存到浏览器、搜索过滤 |
| 👆 字段选择 | 点击选择、单表字段搜索、table.* 全选、拖拽排序、聚合函数设置 |
| 🔗 多表关联 | 同名字段自动推荐 JOIN 条件、支持 INNER/LEFT/RIGHT/FULL JOIN |
| 🎯 筛选过滤 | WHERE 多条件组合(AND/OR)、支持 =/≠/</>/≤/≥/LIKE/IN/BETWEEN/IS NULL |
| 📈 聚合统计 | COUNT/SUM/AVG/MAX/MIN、GROUP BY 分组、HAVING 二次筛选 |
| 📶 排序分页 | ORDER BY 升序/降序、LIMIT 条数限制、DISTINCT 去重 |
| 🔄 嵌套子查询 | 主查询 + 子查询、支持 FROM 派生表 / WHERE IN/NOT IN / EXISTS 四种引用方式 |
| 💡 大表适配 | 字段列表滚动容器、单表字段搜索、字段描述悬停显示完整内容 |
用浏览器直接打开 index.html,无需服务器,无需安装。
点击右上角「📋 加载示例」,工具会自动导入 3 张 HIS 核心表示例数据:
patient- 患者信息表(6 个字段)fee_bill- 费用账单表(4 个字段)inpatient- 住院记录表(6 个字段)
点击左侧表卡片选中 → 字段列表自动展开 → 点击字段加入 SELECT:
- ✅ 表选中状态 → 紫色高亮显示
- ✅ 字段选中状态 → 蓝色文字 + 背景
- ✅ 字段后面的灰色小字是字段注释,鼠标悬停看完整内容
| 操作 | 位置 | 说明 |
|---|---|---|
| JOIN 关联 | 中间上方「🔗 JOIN」卡片 | 选 ≥ 2 张表后自动弹出 |
| WHERE 筛选 | 中间右侧「🎯 WHERE」 | 点击「+ 添加」新增条件 |
| GROUP BY 分组 | 中间右侧「📊 GROUP BY」 | 点击「+ 添加」新增分组字段 |
| HAVING 筛选 | 中间右侧「🔍 HAVING」 | 添加 GROUP BY 后才显示 |
| ORDER BY 排序 | 中间右侧「📶 ORDER BY」 | 点击「+ 添加」新增排序 |
| DISTINCT / LIMIT | 中间最下方「⚙️ 选项」 | 勾选去重或输入限制条数 |
右侧实时预览生成的 SQL,点击「📋 复制 SQL」直接粘贴到数据库客户端。
- 点击右上角「📤 导出 Excel 模板」
- 模板包含 5 列:
| 列名 | 说明 | 示例 |
|---|---|---|
| 表名 | 必填,表的英文名称 | patient |
| 表描述 | 可选,表的中文说明 | 患者信息表 |
| 字段名 | 必填,字段英文名称 | patient_id |
| 字段类型 | 必填,字段数据类型 | varchar |
| 字段说明 | 可选,字段中文含义 | 患者ID |
- 点击右上角「📥 导入数据字典」
- 切换到「Excel 导入」标签
- 拖拽
.xlsx文件到虚线框,或点击「选择 Excel 文件」 - 工具自动解析并显示预览
- 确认表名和表描述 → 点击「确认导入」
💡 兼容旧格式:旧版只有 3 列(字段名/字段类型/字段说明)的 Excel 也能正常导入,表名从文件名自动提取。
- 点击右上角「📥 导入数据字典」
- 切换到「JSON 粘贴」标签
- 粘贴如下格式的 JSON:
[
{
"tableName": "patient",
"tableComment": "患者信息表",
"fields": [
{ "name": "patient_id", "type": "varchar", "comment": "患者ID" },
{ "name": "name", "type": "varchar", "comment": "姓名" },
{ "name": "age", "type": "int", "comment": "年龄" }
]
},
{
"tableName": "fee_bill",
"tableComment": "费用账单表",
"fields": [
{ "name": "bill_id", "type": "varchar", "comment": "账单ID" },
{ "name": "amount", "type": "decimal", "comment": "金额" }
]
}
]- 点击「确认导入」
在搜索框输入任意文字,支持:
- 表名搜索
- 表描述搜索
- 字段名搜索
- 字段注释搜索
匹配的文字会 黄色高亮 显示。
当表的字段 ≥ 5 个时,字段列表顶部会自动出现搜索框:
- 输入关键字实时过滤
- 搜索范围:字段名 + 字段注释 + 字段类型
- 无匹配时显示「无匹配字段」
💡 为什么自动?:HIS 系统很多大表有 100+ 字段,直接翻找效率太低。
点击字段即可切换选中状态:
- 未选中 → 灰色文字
- 已选中 → 蓝色文字 + 浅色背景
当你需要查某表所有字段时:
- 点击字段列表最底部的虚线按钮「➕ 全部字段 (表名.*)」
table.*会作为一个特殊条目加入 SELECT- 可以拖拽调整位置,也可以单独删除
💡 场景:
patient_id, patient.*- 主键放最前面,后面跟所有字段
字段左侧的 ⋮⋮ 手柄就是拖拽区域:
- 按住任意字段的
⋮⋮拖动 - 目标位置显示蓝色插入线
- 松开即完成排序
每个字段右边有一个下拉框(默认显示「—」):
- COUNT - 计数
- SUM - 求和
- AVG - 平均值
- MAX - 最大值
- MIN - 最小值
选了聚合函数后,下拉菜单底部会列出所有已选字段:
- 点击
↪ 目标字段名 - 聚合函数会从当前字段迁移到目标字段
- 目标字段会自动加入 SELECT(如果还没选)
💡 场景:本来选了
SUM(patient.age),想改成SUM(fee_bill.amount),直接选就行,不用先取消再重选。
当你选中 ≥ 2 张表时,工具会自动识别同名字段作为默认 JOIN 条件。
例如同时选 patient 和 fee_bill,两张表都有 patient_id 字段:
- 默认 JOIN 类型:INNER JOIN
- 默认关联字段:
patient.patient_id = fee_bill.patient_id
每张表之间的关联都可以单独调整:
- 左表字段 - 下拉选择
- JOIN 类型 - INNER / LEFT / RIGHT / FULL
- 右表字段 - 下拉选择
点击「+ 添加」按钮新增条件行:
| 列 | 说明 |
|---|---|
| 逻辑符 | 第一个条件不显示,后续条件可选 AND / OR |
| 字段 | 下拉选择所有已选表的字段 |
| 操作符 | = / ≠ / < / > / ≤ / ≥ / LIKE / IN / NOT IN / BETWEEN / IS NULL / IS NOT NULL |
| 值 | 输入框,IS NULL / IS NOT NULL 时自动禁用 |
点击条件行最右侧的 ✕ 按钮。
- 选
patient表 → 选dept_name字段 - 字段聚合下拉选
COUNT→COUNT(dept_name) - 添加 GROUP BY → 选
dept_name - 生成的 SQL:
SELECT
patient.dept_name,
COUNT(patient.dept_name)
FROM patient
GROUP BY patient.dept_name添加 GROUP BY 之后才能加 HAVING:
- 点击「+ 添加」新增 HAVING 条件
- 选择聚合函数(COUNT/SUM/AVG)
- 选择字段(可选 * 或具体字段)
- 选择操作符和值
例如:筛选人数 ≥ 10 的科室
SELECT
patient.dept_name,
COUNT(*)
FROM patient
GROUP BY patient.dept_name
HAVING COUNT(*) >= 10点击顶部标签栏最右侧的「+ 子查询」按钮。
在子查询页面的「📌 引用方式」下拉中选择:
| 类型 | 说明 | 示例 |
|---|---|---|
| FROM | 子查询作为派生表 | FROM (SELECT ...) AS sub1 |
| WHERE IN | 字段值在子查询结果中 | WHERE patient_id IN (SELECT ...) |
| WHERE NOT IN | 字段值不在子查询结果中 | WHERE patient_id NOT IN (SELECT ...) |
| WHERE EXISTS | 子查询至少返回一行 | WHERE EXISTS (SELECT ...) |
当引用方式是 IN / NOT IN 时,需要选择父查询的字段作为关联键:
- 点击「父查询字段」下拉
- 列出父查询所有已选字段
- 直接选择即可
点击子查询标签最右侧的 ✕ 按钮(主查询不能删)。
💡 深度嵌套:子查询还可以继续加子查询,支持无限层级嵌套
勾选后自动在 SELECT 前面加 DISTINCT,去除重复行。
输入数字,限制返回的行数(例如 100 = 只返回前 100 条)。
SELECT
patient.patient_id,
patient.name,
patient.gender,
patient.age,
inpatient.in_date,
inpatient.out_date
FROM patient
INNER JOIN inpatient ON patient.patient_id = inpatient.patient_id
WHERE inpatient.out_date = '2026-04-26'SELECT
patient.dept_name,
SUM(fee_bill.amount) AS 总费用
FROM patient
INNER JOIN fee_bill ON patient.patient_id = fee_bill.patient_id
INNER JOIN inpatient ON patient.patient_id = inpatient.patient_id
GROUP BY patient.dept_name
HAVING SUM(fee_bill.amount) >= 10000
ORDER BY SUM(fee_bill.amount) DESCSELECT * FROM patient
WHERE patient_id IN (
SELECT patient_id FROM inpatient
WHERE status = '在院'
)- ✅ 数据字典:自动保存到浏览器 LocalStorage,刷新不丢失
- ✅ 查询配置:已选的表、字段、JOIN、WHERE 等全部自动保存
- ✅ 子查询配置:子查询的所有设置也会自动保存
⚠️ 清除浏览器缓存会丢失数据,重要的数据字典请保留 Excel 备份。
sql-generator/
├── index.html # 主页面
├── app_core.js # 核心逻辑(状态管理、渲染)
├── app_actions.js # 操作函数(SQL生成、导入导出)
├── app.js # 旧版(保留兼容)
└── README.md # 使用说明 ← 你正在看的
| 日期 | 里程碑 |
|---|---|
| 2026-04-25 | 基础版本(SELECT/WHERE/ORDER BY/Excel导入) |
| 2026-04-25 | 聚合函数 + GROUP BY + HAVING + 现代化UI |
| 2026-04-25 | 嵌套子查询 + 四种引用方式 |
| 2026-04-25 | 字段搜索高亮 + 子查询字段下拉选择器 |
| 2026-04-25 | 字段拖拽排序 + table.* 折叠支持 + 子查询删除 |
| 2026-04-26 | 选择表默认首字段 + table.* 可拖拽条目 |
| 2026-04-26 | 聚合目标切换 + 大表滚动容器 + 单表字段搜索 |
| 2026-04-26 | 字段描述悬停显示 + Excel 5 列新格式 |
让医护人员零门槛查数据:
- 不用记表名 — 中文表名 + 搜索
- 不用记字段名 — 字段注释 + 描述悬停
- 不用写 JOIN — 自动识别关联字段
- 不用背语法 — 点点鼠标生成标准 SQL
- 不用怕大表 — 100+ 字段照样搜、照样滚