assets/2026-07-01-医数智联系列开篇-医院数字化工作者的工具箱_2026-07-01_18-28-11.jpg

医数智联·第 07 期:MySQL 基础 —— 医院人必会的 10 个 SQL,从「求 IT」到「自己 5 分钟」

[!ABSTRACT] 核心摘要

  • 本期主题:MySQL 基础 + 医院人必会的 10 个 SQL,看完能独立查首页数据
  • 核心结论:医院 90% 的 HIS/LIS/电子病历系统都用 MySQL,会写 SQL 就能脱离「求 IT 等 3 天」的困境
  • 10 个 SQL:SELECT / WHERE / ORDER BY / GROUP BY / HAVING / LIMIT / COUNT / DISTINCT / INSERT/UPDATE/DELETE(前 5 个最常用)
  • 典型效果:从「提需求 → IT 排期 → 3 天后回复」变成「自己写 SQL → 5 分钟出结果」
  • 阅读时长:约 10 分钟

一、场景引入:为什么医院人必须会 SQL?

[!example] 一个真实的周二下午
质管办小张想统计「上月骨科首页主诊错误率」,他给信息科小李发微信:

「小李,帮我跑个数据,骨科上月首页主诊错误的有多少条?」

小李回复:

「我现在在做院长要的报表,你等 3 天。」

3 天后,小张拿到结果:24 条

但他紧接着想问:「这 24 条,主要错误类型是什么?按责任医生分组呢?」

又等 3 天。

一个简单的统计,来回 6 天。

这是医院数据工作的普遍困境:

现状 痛点
数据在 HIS,只有 IT 能查 业务部门被「卡脖子」
IT 排期永远在 1 周以上 「时效性」丧失
一旦要「交叉维度」分析 得重新提需求
院领导临时要数据 手忙脚乱

[!quote] 狼叔的判断
“医院人不会 SQL,等于把医院的’神经系统’交给别人控制。” MySQL 是中国医院 90% 以上在用的数据库(配套 HIS),学 SQL 不是程序员的专利,是每个医院管理者的基本功
三甲评审条款要求”建立医疗质量安全数据库”以及”建立专病数据库”, 你当然可以买现成的产品, 也可以求信息科做, 但是资源消耗和沟通成本巨大, 你的需求稍有变化都涉及一个漫长的过程.


二、工具原理:MySQL 是什么?SQL 是什么?

2.1 MySQL 是什么?

[!info] MySQL 是什么?
MySQL 是一款关系型数据库管理系统——你可以把它想象成一个「超级 Excel」:

  • 整个数据库 = 一个 Excel 工作簿
  • 一张表 = 一个工作表(SHEET)
  • 一行 = 一条记录(比如 1 份病案首页)
  • 一列 = 一个字段(比如「主诊 ICD 编码」)

和 Excel 的本质区别:Excel 适合 < 10 万行,MySQL 可以处理 1 亿行;Excel 不支持多表关联查询,MySQL 是为关联查询而生的。

2.2 SQL 是什么?

[!info] SQL 是什么?
SQL(Structured Query Language,结构化查询语言) 是和数据库「对话」的语言。

你写一句 SQL,数据库就帮你执行——查询、统计、修改、删除都行。

打个比方:

你熟悉的概念 SQL 对应 说明
Excel 筛选 WHERE 筛选符合条件的行
Excel 排序 ORDER BY 按某列排序
Excel 分类汇总 GROUP BY 按某列分组,做统计
Excel 多表关联 JOIN 把多张表拼起来
Excel 公式 COUNT/SUM/AVG 聚合函数

2.3 为什么医院必须会 MySQL?

[!TIP] 4 大理由

  1. 市场占有率:中国 90%+ 的医院 HIS/LIS/电子病历系统使用 MySQL 或兼容 MySQL 协议的数据库
  2. 学习成本低:SQL 是「最像自然语言的编程语言」,10 个常用语句就能覆盖 80% 场景
  3. 回报巨大:会 SQL 的医院人,工作效率提升 5-10 倍
  4. 生态成熟:Navicat、DBeaver、DataGrip 等几十款免费 GUI 工具

2.4 安装与连接

[!tip] 3 步安装

步骤 1:安装 MySQL

  • 医院内网:直接联系信息科开通账号,通常地址是 192.168.x.x:3306
  • 本机学习:mysql.com/downloads,下载 MySQL Community Server 8.0

步骤 2:安装 GUI 工具(强烈推荐)

  • Navicat(收费,医院常用)
  • DBeaver(免费,开源):dbeaver.io
  • DataGrip(JetBrains 出品,功能最强)

步骤 3:连接数据库

1
2
3
4
5
6
-- 连接参数
HOST: 192.168.1.100 -- 数据库地址
PORT: 3306 -- 默认端口
USER: quality_user -- 用户名(让信息科开)
PASSWORD: ******** -- 密码
DATABASE: his_db -- 数据库名(让信息科告诉你)

三、医院实战:10 个必会 SQL

[!example] 实战 ①:基础查询 5 个 SQL

3.1 SQL ①:SELECT + FROM(查所有)

1
2
3
SELECT *
FROM 首页主表
LIMIT 100;

翻译:从「首页主表」查 100 条记录。

SELECT * 表示所有列,LIMIT 100 限制只返回 100 行(关键习惯,避免一次性查 10 万行卡死)。

3.2 SQL ②:WHERE(条件筛选)

1
2
3
4
5
SELECT 病案号, 患者姓名, 主诊ICD编码, 出院日期
FROM 首页主表
WHERE 出院日期 >= '2026-06-01'
AND 出院日期 &lt; '2026-07-01'
AND 科室 = '骨科';

翻译:查骨科 2026 年 6 月的所有出院患者的主诊。

关键技巧:

  • 日期范围用 >=<,避免用 BETWEEN(边界不直观)
  • 字符串值用单引号 '骨科',不是双引号
  • AND 多个条件并列

3.3 SQL ③:ORDER BY(排序)

1
2
3
4
5
SELECT 病案号, 主诊ICD编码, 出院日期
FROM 首页主表
WHERE 科室 = '骨科'
ORDER BY 出院日期 DESC
LIMIT 50;

翻译:查骨科最近 50 条出院记录(按日期倒序)。

DESC = 降序(从大到小),ASC = 升序(从小到大,默认)。

3.4 SQL ④:GROUP BY(分组统计)

1
2
3
4
5
6
SELECT 责任医生, COUNT(*) AS 错误数
FROM 首页主表
WHERE 主诊错误标记 = 1
AND 出院日期 >= '2026-06-01'
GROUP BY 责任医生
ORDER BY 错误数 DESC;

翻译:统计 6 月份每位责任医生的主诊错误数,按错误数从高到低排序。

这是医院最常用的 SQL 之一——质管办用它做月度报表。

3.5 SQL ⑤:HAVING(分组后再筛选)

1
2
3
4
5
6
SELECT 责任医生, COUNT(*) AS 错误数
FROM 首页主表
WHERE 主诊错误标记 = 1
GROUP BY 责任医生
HAVING COUNT(*) >= 5
ORDER BY 错误数 DESC;

翻译:统计主诊错误 ≥ 5 例的责任医生。

WHERE vs HAVING:

  • WHERE:筛选(分组前)
  • HAVING:筛选(分组后)

3.6 SQL ⑥:COUNT / SUM / AVG(聚合函数)

1
2
3
4
5
6
7
8
9
10
11
-- 总数
SELECT COUNT(*) FROM 首页主表 WHERE 科室 = '骨科';

-- 错误总数
SELECT SUM(错误分值) FROM 首页主表 WHERE 科室 = '骨科';

-- 平均住院日
SELECT AVG(住院天数) FROM 首页主表 WHERE 科室 = '骨科';

-- 最大住院日
SELECT MAX(住院天数) FROM 首页主表 WHERE 科室 = '骨科';

3.7 SQL ⑦:DISTINCT(去重)

1
2
3
4
-- 骨科一共多少位不同的责任医生?
SELECT COUNT(DISTINCT 责任医生)
FROM 首页主表
WHERE 科室 = '骨科';

3.8 SQL ⑧:LIMIT(限制返回行数)

1
2
3
4
5
6
7
8
SELECT *
FROM 首页主表
WHERE 科室 = '骨科'
ORDER BY 出院日期 DESC
LIMIT 10 OFFSET 0; -- 第 1 页,每页 10 条

LIMIT 10 OFFSET 10; -- 第 2 页
LIMIT 10 OFFSET 20; -- 第 3 页

这是做分页查询的关键

3.9 SQL ⑨:INSERT(插入)

1
2
INSERT INTO 首页主表 (病案号, 患者姓名, 主诊ICD编码, 出院日期)
VALUES ('BA20260715001', '张三', 'M16.901', '2026-07-15');

[!warning] 慎用
INSERT 会真的写入数据库!建议先用 SELECT * 验证数据,再改写为 INSERT

3.10 SQL ⑩:UPDATE / DELETE(更新/删除)

1
2
3
4
5
6
7
8
-- 更新(必须加 WHERE,否则全表更新!)
UPDATE 首页主表
SET 主诊错误标记 = 1, 错误原因 = '主诊未选主要诊断'
WHERE 病案号 = 'BA20260715001';

-- 删除(必须加 WHERE,否则全表删除!)
DELETE FROM 首页主表
WHERE 病案号 = 'BA20260715001';

[!DANGER] 极度危险
UPDATE / DELETE 不加 WHERE 会全表操作,可能丢失全院数据! 修改前一定先 SELECT 验证。


四、避坑指南:5 个让新手”踩雷”的常见错误

[!warning] 雷区 ①:SELECT * 不加 LIMIT
症状:查全表返回 100 万行,GUI 工具卡死,生产数据库被拖慢。
解决:永远加 LIMIT,先用 100 行调试,再放开。

[!warning] 雷区 ②:日期用 BETWEEN
症状:WHERE date BETWEEN '2026-06-01' AND '2026-06-30' 漏掉了 6 月 30 日当天的数据。
原因:BETWEEN 包含两端,但如果你的日期字段带时间('2026-06-30 14:00'),BETWEEN ... '2026-06-30' 会漏掉当天 14 点之后的数据。
解决:>=<:WHERE date >= '2026-06-01' AND date &lt; '2026-07-01'

[!warning] 雷区 ③:字符串用双引号
症状:WHERE 科室 = "骨科" 在 MySQL 中报错。
原因:MySQL 标准 SQL 用单引号 ' 包裹字符串,双引号在 MySQL 中有特殊含义(标识符)。
解决:统一用单引号

[!warning] 雷区 ④:NULL 判断用 = NULL
症状:WHERE 主诊ICD编码 = NULL 永远查不到结果。
原因:SQL 中 NULL 表示「未知」,不能用 = 判断,要用 IS NULLIS NOT NULL
解决:WHERE 主诊ICD编码 IS NULL

[!warning] 雷区 ⑤:忘记 WHERE 的 UPDATE/DELETE
症状:误执行 UPDATE 首页主表 SET 错误标记 = 1全院首页都被标记为错误
解决:

  1. UPDATE/DELETE 前,SELECT * WHERE <条件> 验证;
  2. 开启 MySQL 的**「安全更新」**:SET SQL_SAFE_UPDATES = 1;
  3. 关键操作先在测试库跑一遍

五、下期预告

[!quote] 第 08 期
MySQL 进阶:首页数据 5 大常用查询 —— JOIN/子查询/窗口函数

单表查询搞定后,这一期讲怎么把「首页主表 + 诊断表 + 手术表 + 医生表」4 张表拼起来,做更复杂的交叉分析。


[!TIP] 互动
如果你觉得这篇「医数智联·第 07 期」对你有用,请点赞、在看、转发给科里的同事。

我是白衣狼,一个用数字化工具把医院管理做「轻」的实战派。咱们下期见。