SQL快速查找分组记录数异常的分类_利用HAVING筛选

张开发
2026/4/16 6:50:26 15 分钟阅读

分享文章

SQL快速查找分组记录数异常的分类_利用HAVING筛选
HAVING是唯一能在分组后对COUNT(*)等聚合结果过滤的语法WHERE在分组前执行无法使用聚合函数误用会报错必须将聚合条件置于GROUP BY后的HAVING中且需注意各数据库对非聚合字段和别名的兼容性差异。用 HAVING 筛选分组后数量异常的类别直接说结论HAVING 是唯一能在分组后对聚合结果比如 COUNT(*)做条件过滤的语法WHERE 在分组前就执行根本看不到分组统计值。常见错误是写成 WHERE COUNT(*) 10 —— 这会报错 ERROR: aggregate functions are not allowed in WHERE因为 WHERE 阶段 COUNT(*) 还没算出来。必须把聚合条件挪到 HAVING 子句里且只能跟在 GROUP BY 后面HAVING 的执行顺序在 GROUP BY 之后、ORDER BY 之前逻辑上就是“先分组再筛组”如果还带了 WHERE它只负责过滤原始行比如排除 status deleted不影响分组逻辑查“记录数少于 3 条”的异常分类业务中常要定位数据稀疏的分类比如某商品类目下只有 1–2 条商品可能是录入遗漏或同步失败。示例查 product 表中每个 category_id 下商品数 SELECT category_id, COUNT(*) AS cntFROM productGROUP BY category_idHAVING COUNT(*) 3;注意点别漏写 GROUP BY —— 没它 HAVING 会直接报错HAVING 中的字段必须是 SELECT 列表里的聚合列或 GROUP BY 字段不能写未分组的普通列如 name如果想同时看具体有哪些商品得用子查询或 JOIN 关联原表HAVING 本身不保留明细HAVING 和 WHERE 混用时的性能与语义区别两者位置和作用完全不同混用不是“多加一层过滤”而是分工明确 Mokker AI AI产品图添加背景

更多文章