医数智联·第 07 期:MySQL 基础 —— 医院人必会的 10 个 SQL,从「求 IT」到「自己 5 分钟」
医数智联·第 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 大理由
- 市场占有率:中国 90%+ 的医院 HIS/LIS/电子病历系统使用 MySQL 或兼容 MySQL 协议的数据库
- 学习成本低:SQL 是「最像自然语言的编程语言」,10 个常用语句就能覆盖 80% 场景
- 回报巨大:会 SQL 的医院人,工作效率提升 5-10 倍
- 生态成熟: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 | SELECT * |
翻译:从「首页主表」查 100 条记录。
SELECT * 表示所有列,LIMIT 100 限制只返回 100 行(关键习惯,避免一次性查 10 万行卡死)。
3.2 SQL ②:WHERE(条件筛选)
1 | SELECT 病案号, 患者姓名, 主诊ICD编码, 出院日期 |
翻译:查骨科 2026 年 6 月的所有出院患者的主诊。
关键技巧:
- 日期范围用
>=和<,避免用BETWEEN(边界不直观) - 字符串值用单引号
'骨科',不是双引号 AND多个条件并列
3.3 SQL ③:ORDER BY(排序)
1 | SELECT 病案号, 主诊ICD编码, 出院日期 |
翻译:查骨科最近 50 条出院记录(按日期倒序)。
DESC = 降序(从大到小),ASC = 升序(从小到大,默认)。
3.4 SQL ④:GROUP BY(分组统计)
1 | SELECT 责任医生, COUNT(*) AS 错误数 |
翻译:统计 6 月份每位责任医生的主诊错误数,按错误数从高到低排序。
这是医院最常用的 SQL 之一——质管办用它做月度报表。
3.5 SQL ⑤:HAVING(分组后再筛选)
1 | SELECT 责任医生, COUNT(*) AS 错误数 |
翻译:统计主诊错误 ≥ 5 例的责任医生。
WHERE vs HAVING:
WHERE:筛选行(分组前)HAVING:筛选组(分组后)
3.6 SQL ⑥:COUNT / SUM / AVG(聚合函数)
1 | -- 总数 |
3.7 SQL ⑦:DISTINCT(去重)
1 | -- 骨科一共多少位不同的责任医生? |
3.8 SQL ⑧:LIMIT(限制返回行数)
1 | SELECT * |
这是做分页查询的关键。
3.9 SQL ⑨:INSERT(插入)
1 | INSERT INTO 首页主表 (病案号, 患者姓名, 主诊ICD编码, 出院日期) |
[!warning] 慎用
INSERT 会真的写入数据库!建议先用SELECT *验证数据,再改写为INSERT。
3.10 SQL ⑩:UPDATE / DELETE(更新/删除)
1 | -- 更新(必须加 WHERE,否则全表更新!) |
[!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 < '2026-07-01'。
[!warning] 雷区 ③:字符串用双引号
症状:WHERE 科室 = "骨科"在 MySQL 中报错。
原因:MySQL 标准 SQL 用单引号'包裹字符串,双引号在 MySQL 中有特殊含义(标识符)。
解决:统一用单引号。
[!warning] 雷区 ④:NULL 判断用
= NULL
症状:WHERE 主诊ICD编码 = NULL永远查不到结果。
原因:SQL 中NULL表示「未知」,不能用=判断,要用IS NULL或IS NOT NULL。
解决:WHERE 主诊ICD编码 IS NULL。
[!warning] 雷区 ⑤:忘记
WHERE的 UPDATE/DELETE
症状:误执行UPDATE 首页主表 SET 错误标记 = 1→ 全院首页都被标记为错误。
解决:
- UPDATE/DELETE 前,先
SELECT * WHERE <条件>验证;- 开启 MySQL 的**「安全更新」**:
SET SQL_SAFE_UPDATES = 1;- 关键操作先在测试库跑一遍。
五、下期预告
[!quote] 第 08 期
MySQL 进阶:首页数据 5 大常用查询 —— JOIN/子查询/窗口函数单表查询搞定后,这一期讲怎么把「首页主表 + 诊断表 + 手术表 + 医生表」4 张表拼起来,做更复杂的交叉分析。
[!TIP] 互动
如果你觉得这篇「医数智联·第 07 期」对你有用,请点赞、在看、转发给科里的同事。我是白衣狼,一个用数字化工具把医院管理做「轻」的实战派。咱们下期见。





