COUNT(*)统计所有行含NULLCOUNT(字段)跳过NULLGROUP BY需与SELECT非聚合字段一致WHERE过滤行HAVING过滤分组结果状态字段需规范类型与值以保证分组精度。count(*) 和 count(字段) 在统计状态时结果可能不同直接写 SELECT status, COUNT(*) FROM orders GROUP BY status 是最常用做法但要注意如果 status 字段允许为 NULLCOUNT(status) 会跳过这些行而 COUNT(*) 不会。实际业务里“未设置状态”常被存为 NULL这时用 COUNT(*) 才能体现“这一组有多少条记录”而不是“有多少条非空状态记录”。常见错误现象COUNT(status) 返回 0 条但肉眼可见表里有几十条 status IS NULL 的数据。统计总数含 NULL→ 用 COUNT(*)只统计明确赋值的状态 → 用 COUNT(status)但得先确认业务是否真要排除 NULL想把 NULL 单独归为一类统计加 COALESCE(status, unknown) 再分组GROUP BY 后没选非聚合字段会报错ONLY_FULL_GROUP_BYMySQL 5.7 默认开启 ONLY_FULL_GROUP_BY 模式如果写 SELECT id, status, COUNT(*) FROM orders GROUP BY status会直接报错Expression #1 of SELECT list is not in GROUP BY clause。这不是语法错是 SQL 标准强制要求SELECT 中每个非聚合字段都必须出现在 GROUP BY 里。使用场景你想看每个状态对应的第一条订单 ID那得用子查询或窗口函数不能靠 GROUP BY 硬拖。只想看状态和数量 → 只写 SELECT status, COUNT(*)需要关联其他字段比如最新创建时间→ 改用 MAX(created_at) 这类聚合函数真要取某一行完整数据 → 别硬套 GROUP BY考虑 ROW_NUMBER() OVER (PARTITION BY status ORDER BY created_at DESC)状态字段类型影响分组精度字符串 vs 枚举 vs 数字如果 status 是 VARCHAR 类型但值里混着空格、大小写不一致比如 pending 和 PendingGROUP BY 会当成两个不同状态。数字型状态如 0/1/2看似安全但如果前端传参没校验可能存进字符串 1 带空格同样导致重复分组。 HIX.AI HIX.AI是一个多功能的一体化AI写作助手集成了120多种AI写作工具支持50多种语言能够满足各种写作需求。