如何编写SQL查询所有就诊患者年龄均低于30岁的医生姓名?
表结构说明
- Doctor表:存储医生基础信息,包含字段
ID、name、phone - Patient表:存储患者基础信息,包含字段
ID、name、phone、age、sex - DoctorPatient表:多对多关联表,存储医生和患者的绑定关系,包含字段
DoctorID、PatientID
需求
查询名下所有患者年龄均小于30岁的医生姓名
实现SQL
写法1:分组聚合实现(逻辑直观易读)
通过按医生分组后校验患者最大年龄的方式筛选符合条件的医生:
SELECT d.name FROM Doctor d INNER JOIN DoctorPatient dp ON d.ID = dp.DoctorID INNER JOIN Patient p ON dp.PatientID = p.ID GROUP BY d.ID, d.name HAVING MAX(p.age) < 30;
边界补充:如果需要把没有任何绑定患者的医生也包含在结果中,将
INNER JOIN改为LEFT JOIN,并修改HAVING条件为HAVING MAX(p.age) < 30 OR MAX(p.age) IS NULL即可。
写法2:NOT EXISTS实现(大数据量下性能更优)
通过反向排除「存在年龄≥30岁患者的医生」得到结果:
SELECT DISTINCT d.name FROM Doctor d WHERE NOT EXISTS ( SELECT 1 FROM DoctorPatient dp INNER JOIN Patient p ON dp.PatientID = p.ID WHERE dp.DoctorID = d.ID AND p.age >= 30 );
内容的提问来源于stack exchange,提问作者Melenko Oleksandr
相关产品推荐
相关产品推荐

