去重后可正常排序,使用DISTINCT去除重复行并结合ORDER BY排序,如SELECT DISTINCT name, age FROM users ORDER BY age DESC;GROUP BY则用于按字段分组并聚合,如SELECT name, MAX(age) AS age FROM users GROUP BY name ORDER BY age DESC;支持多字段排序,如SELECT DISTINCT department, salary, name FROM employees ORDER BY department ASC, salary DESC,注意索引优化及SELECT字段与GROUP BY匹配。

在MySQL中,去重和排序是数据查询中常见的需求。去重通常使用 DISTINCT 或 GROUP BY 实现,而排序则通过 ORDER BY 完成。关键在于:只要去重操作完成后仍保留需要排序的字段,就可以正常进行排序。
使用 DISTINCT 去重并排序
当你只需要去除完全重复的行时,DISTINCT 是最直接的方法。去重后可直接使用 ORDER BY 对结果排序。
- DISTINCT 作用于所有选中的字段,只有当这些字段的组合值完全相同时才会去重
- 去重后的结果可以像普通查询一样排序
示例:
SELECT DISTINCT name, age FROM users ORDER BY age DESC;
这条语句会先去除 name 和 age 组合重复的记录,然后按 age 从高到低排序。
使用 GROUP BY 实现更灵活的去重与排序
当需要根据某一字段去重,同时保留其他聚合信息(如最大值、最小值),GROUP BY 更加灵活。
- GROUP BY 按指定字段分组,每组返回一行
- 可结合 MAX()、MIN() 等函数选择具体值
- 支持对聚合结果或分组字段排序
示例:
SELECT name, MAX(age) AS age FROM users GROUP BY name ORDER BY age DESC;
按 name 分组,取每组中 age 最大的记录,并按 age 降序排列。
去重后按多个字段排序
排序可以基于多个字段,实现更精细的控制。
示例:
SELECT DISTINCT department, salary, name FROM employees ORDER BY department ASC, salary DESC;
先按部门升序排列,同一部门内按薪资降序展示。
注意事项
去重和排序虽然简单,但有几个点需要注意:
- DISTINCT 对性能有一定影响,尤其在大数据量或多字段情况下,建议在相关字段上建立索引
- 使用 GROUP BY 时,SELECT 中的非聚合字段必须出现在 GROUP BY 子句中(MySQL 5.7+ 严格模式下)
- ORDER BY 必须写在 DISTINCT 或 GROUP BY 之后
基本上就这些。掌握 DISTINCT 和 GROUP BY 的使用场景,再配合 ORDER BY,就能高效完成去重排序任务。不复杂但容易忽略细节。










