You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中如何筛选检查次数大于10的医生?示例代码优化咨询

如何用COUNT筛选检查次数大于10的医生?

嘿,这个问题太常见了!咱们先把核心逻辑理清楚:你要筛选的是分组后的聚合结果(也就是每个医生的检查次数),这时候绝对不能用WHERE,得用HAVING子句——原因很简单:WHERE是在分组前过滤原始行的,这时候COUNT()的结果还没计算出来;而HAVING就是专门用来在分组完成后,对聚合值做筛选的工具。

给你的SQL修改方案

我帮你调整了原语句,不仅加上了筛选条件,还优化了几个容易踩坑的细节:

SELECT 
  doctor.name, 
  doctor.surname, 
  COUNT(checkup.doctor) AS checkup_count  -- 给聚合结果起个别名,后续引用更清晰
FROM doctor
JOIN checkup ON doctor.id = checkup.doctor  -- 用显式JOIN替代旧的隐式写法,可读性更强,也不容易出错
GROUP BY doctor.id, doctor.name, doctor.surname  -- 用唯一的doctor.id分组,避免同名医生被错误合并
HAVING COUNT(checkup.doctor) > 10  -- 这就是筛选检查次数大于10的关键语句!
ORDER BY checkup_count DESC;  -- 用别名排序,直观又好维护

几个关键细节解释

  • 为什么必须用HAVING?:COUNT()这类聚合函数的结果是在GROUP BY执行后才生成的,WHERE在分组前就运行了,根本看不到这些聚合值,只有HAVING能在分组完成后对聚合结果做筛选。
  • 优化GROUP BY的必要性:原语句只按doctor.name分组,要是有两个同名不同姓的医生,他们的记录会被错误合并成一行。加上doctor.id(医生的唯一标识)就绝对不会出问题,同时带上name和surname是为了兼容不同数据库的分组规则。
  • 显式JOIN更靠谱:旧的FROM table1, table2写法很容易遗漏连接条件,导致出现笛卡尔积(结果行数爆炸),用JOIN ... ON的显式写法逻辑更清晰,后续维护也更方便。

内容的提问来源于stack exchange,提问作者Pera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:31:02