SQL如何统计分组内的最高和最低值_MAX与MIN聚合应用
GROUP BY 配合 MAX()/MIN() 是统计每组最大最小值最直接可靠的方式需确保 SELECT 中非聚合字段均出现在 GROUP BY 中NULL 自动忽略索引应为分组字段聚合字段以提升性能。GROUP BY 后直接用 MAX() 和 MIN() 就行SQL 里统计每组最大最小值不需要子查询或窗口函数除非你要保留原始行MAX() 和 MIN() 配合 GROUP BY 是最直觉也最稳妥的方式。它在所有主流数据库MySQL、PostgreSQL、SQL Server、SQLite里行为一致语义清晰。常见错误是试图在没 GROUP BY 的情况下混用聚合和非聚合字段比如SELECT category, MAX(price), name FROM products; —— 这在严格模式下直接报错因为 name 没参与分组也没聚合数据库不知道该取哪一行的 name。必须确保 SELECT 中所有非聚合字段都出现在 GROUP BY 子句中如果想同时拿到最高价那条记录的完整信息比如商品名、IDMAX() 本身做不到得换 ROW_NUMBER() 或相关技巧空值NULL会被自动忽略——除非整组全是 NULL此时 MAX()/MIN() 返回 NULL遇到 ONLY_FULL_GROUP_BY 报错怎么办MySQL 5.7 默认开启 ONLY_FULL_GROUP_BY 模式一写错就报类似 Expression #2 of SELECT list is not in GROUP BY clause 的错误。这不是 bug是 SQL 标准在强制你写清楚意图。别急着关掉这个模式关了反而埋坑先检查你的 SELECT 列哪些是分组键哪些是聚合结果哪些是“多余”的。例如SELECT dept, MAX(salary), employee_name FROM staff GROUP BY dept;这里 employee_name 没聚合也没分组MySQL 拒绝执行。解决方法只有两个删掉 employee_name如果你真只需要部门最高薪数值改用聚合函数包裹它比如 MAX(employee_name)语义变了取的是字典序最大名字不是最高薪那个人MAX() 和 MIN() 能用在非数字字段上吗能而且很常用。它们按字段类型的自然顺序比较字符串按字典序日期按时间先后布尔值按 FALSE TRUE。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。