DISTINCT用于去除SELECT结果中重复行,作用于整个字段列表而非单个字段;依据所有SELECT列构成的元组去重,支持与COUNT配合统计去重数量,但无法指定保留哪条重复记录,需用GROUP BY或窗口函数替代。

DISTINCT 是 MySQL 中用于去除查询结果中重复行的关键字,它作用于整个 SELECT 列表,而不是单个字段。
distinct 的基本用法
在 SELECT 后紧跟 DISTINCT,会返回唯一组合的记录。例如:
- SELECT DISTINCT name FROM users; —— 返回所有不重复的姓名
- SELECT DISTINCT city, province FROM addresses; —— 返回城市与省份的唯一组合(即使 city 相同,只要 province 不同就算不同行)
distinct 只对查询字段生效
DISTINCT 依据的是 SELECT 子句中列出的所有列值构成的“元组”。哪怕只多选一个字段,去重逻辑就完全不同:
- SELECT DISTINCT id, name FROM users; —— 即使 name 相同,只要 id 不同,整行就不算重复
- 想按 name 去重并取某条对应记录(如最新一条),DISTINCT 无法实现,需改用 GROUP BY 或窗口函数
distinct 与 count 配合统计去重数量
常用写法:SELECT COUNT(DISTINCT name) FROM users;
- 统计不重复的 name 数量
- 支持多字段:COUNT(DISTINCT city, province) 统计城市+省份组合数
- 注意:NULL 值在 DISTINCT 中被视为相同值,多个 NULL 只算一个
distinct 的限制和替代方案
DISTINCT 不能跳过某些列去重,也不能指定保留哪一条重复数据。
- 若需“按 name 去重,同时取 age 最大的那条”,应使用 GROUP BY + 聚合函数:SELECT name, MAX(age) FROM users GROUP BY name;
- 若需完整行且带条件筛选(如最新创建时间),推荐用 ROW_NUMBER() 窗口函数(MySQL 8.0+)或关联子查询
- DISTINCT 会隐式排序(部分版本),但不保证顺序,如需确定顺序,必须显式加 ORDER BY










