MIMIC-III数据库SQL入门教程:医疗数据分析基础
2025-07-10 05:14:02作者:邓越浪Henry
前言
MIMIC-III是一个重要的医疗数据库资源,包含了超过6万例住院患者的去标识化医疗数据。本教程将介绍如何使用SQL语言查询和分析MIMIC-III数据库中的数据,帮助医疗数据分析师和研究人员快速上手。
MIMIC-III数据库概述
MIMIC-III是由MIT计算生理学实验室开发的开放医疗数据集,包含2001-2012年间波士顿贝斯以色列女执事医疗中心的患者数据。数据集涵盖了:
- 患者人口统计学信息
- 生命体征记录
- 实验室检测结果
- 药物治疗记录
- 诊断和手术编码
数据以CSV文件格式提供,但通常加载到PostgreSQL等关系型数据库中进行查询和分析。
核心数据表结构
MIMIC-III数据库包含多个相互关联的表,其中三个核心表是:
-
patients表:记录患者基本信息
subject_id
:患者唯一标识符(主键)dob
:出生日期gender
:性别
-
admissions表:记录住院信息
hadm_id
:住院记录唯一标识符(主键)subject_id
:关联的患者ID(外键)admittime
:入院时间
-
icustays表:记录ICU住院信息
icustay_id
:ICU住院唯一标识符(主键)hadm_id
:关联的住院记录ID(外键)los
:住院时长(天)
SQL基础查询
简单SELECT查询
最基本的SQL查询格式是从表中选择特定列:
SELECT 列名1, 列名2
FROM 表名;
例如,查询所有患者ID和出生日期:
SELECT subject_id, dob
FROM patients;
条件查询(WHERE)
使用WHERE子句可以筛选满足特定条件的记录:
SELECT subject_id
FROM patients
WHERE gender = 'F';
排序(ORDER BY)
使用ORDER BY对结果进行排序:
SELECT subject_id, dob
FROM patients
ORDER BY dob DESC; -- 降序排列
表连接(JOIN)
关系型数据库的核心特性是通过键值关联多个表。MIMIC-III中常用的JOIN操作:
内连接(INNER JOIN)
只返回两个表中匹配的记录:
SELECT p.subject_id, p.dob, a.hadm_id, a.admittime
FROM patients p
INNER JOIN admissions a ON p.subject_id = a.subject_id;
多表连接
可以同时连接多个表:
SELECT pat.subject_id, adm.hadm_id, icu.icustay_id
FROM patients pat
INNER JOIN admissions adm ON pat.subject_id = adm.subject_id
INNER JOIN icustays icu ON adm.hadm_id = icu.hadm_id;
高级SQL功能
列计算与别名
可以对列进行计算并赋予别名:
SELECT icustay_id, round(los) AS los_integer_days
FROM icustays;
条件逻辑(CASE WHEN)
实现if-else逻辑:
SELECT subject_id, los,
CASE WHEN los < 2 THEN '短期'
WHEN los BETWEEN 2 AND 7 THEN '中期'
WHEN los > 7 THEN '长期'
ELSE '未知' END AS 住院时长分类
FROM icustays;
临时表与视图
使用WITH创建临时查询结果:
WITH patient_age AS (
SELECT subject_id,
(admittime - dob)/365.25 AS age
FROM admissions a
JOIN patients p ON a.subject_id = p.subject_id
)
SELECT * FROM patient_age WHERE age > 18;
实战示例:提取血压数据
MIMIC-III中血压数据存储在chartevents表中,我们可以通过以下查询提取:
SELECT ce.subject_id, ce.hadm_id, ce.icustay_id,
ce.charttime, ce.valuenum AS sbp_value
FROM chartevents ce
WHERE ce.itemid IN (
SELECT itemid FROM d_items
WHERE label LIKE '%血压%收缩压%'
)
AND ce.valuenum IS NOT NULL
ORDER BY ce.subject_id, ce.charttime;
学习建议
- 从简单查询开始,逐步增加复杂度
- 理解数据库表之间的关系
- 使用EXPLAIN分析查询性能
- 创建常用查询的视图以便复用
- 注意数据类型转换和NULL值处理
通过掌握这些SQL基础,您将能够有效地从MIMIC-III数据库中提取和分析医疗数据,为临床研究和医疗决策提供数据支持。