先按部门分组再按职位细分,并统计人数后排序。使用GROUP BY多列实现分组,ORDER BY多列实现优先按部门升序、再按人数降序排列,非聚合字段须在GROUP BY中出现,可引用别名排序。
在 SQL 中,
SELECT
语句可以通过
GROUP BY
和
ORDER BY
实现多列分组和排序。虽然 GROUP BY 本身不进行“排序”,但常与 ORDER BY 配合使用来达到分组后有序展示的效果。
多列分组(GROUP BY 多列)
使用 GROUP BY 对多个字段进行分组时,数据会先按第一个字段分组,组内再按第二个字段分组,以此类推。适用于需要统计每个组合类别下聚合信息的场景。
例如,按部门和职位统计员工人数:
这条语句会把数据先按 department 分组,每组内再按 position 细分,最后统计每个“部门-职位”组合的人数。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
分组后多列排序(ORDER BY 多列)
分组完成后,若想对结果排序,使用 ORDER BY 指定多个列。排序规则是:优先按第一列排,值相同时按第二列排,依此类推。
继续上面的例子,先按部门升序,同一部门内按职位人数降序
排列
:
注意事项
SELECT 中出现的非聚合字段必须出现在 GROUP BY 子句中,否则会报错(MySQL 严格模式下)。
ORDER BY 可引用 SELECT 中定义的别名(如 employee_count),但 GROUP BY 一般不建议用别名(部分数据库不支持)。
ASC 为升序(默认),DESC 为降序,可混合使用。
基本上就这些。掌握 GROUP BY 和 ORDER BY 的多列配合,能灵活处理大多数分组统计并有序输出的需求。
SELECT
department,
position,
COUNT(*) AS employee_count
FROM employees
GROUP BY department, position;
SELECT
department,
position,
COUNT(*) AS employee_count
FROM employees
GROUP BY department, position
ORDER BY department ASC, employee_count DESC;
