在MySQL数据库查询中,重复数据会影响统计结果的准确性,也会让返回的数据显得冗余,DISTINCT关键字就是专门用于去除查询结果中重复行的工具,掌握它的操作方法能有效优化查询效果。

DISTINCT基本语法
DISTINCT的核心作用是对查询结果中的重复行进行去重,基本语法格式如下:
-- 基本语法 SELECT DISTINCT 列名1, 列名2, ... FROM 表名 [WHERE 条件];
需要注意的是,DISTINCT必须放在所有查询列的最前面,它会作用于后面跟随的所有列,而不是仅作用于第一个列。
单字段去重操作
单字段去重是DISTINCT最常见的使用场景,只需要对单个列进行去重即可。
假设我们有一张用户表user_info,表结构如下:
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
city VARCHAR(20),
age INT
);
表中存在部分重复的城市数据,现在需要查询所有不重复的城市,就可以使用单字段去重的DISTINCT:
-- 查询不重复的城市 SELECT DISTINCT city FROM user_info;
执行该语句后,返回的结果中每个城市只会显示一次,不会存在重复值。
多字段去重操作
当需要对多个字段的组合进行去重时,DISTINCT会判断多个字段的组合是否重复,只有所有字段的值都相同时才会被判定为重复行。
比如我们需要查询不重复的用户名和城市组合,就可以使用多字段去重:
-- 查询不重复的用户名和城市组合 SELECT DISTINCT username, city FROM user_info;
这里只有当username和city两个字段的值都完全相同时,对应的行才会被去重,只要有一个字段的值不同,就会被视为不同的行保留下来。
DISTINCT结合聚合函数使用
DISTINCT还可以和聚合函数配合使用,常见的场景是统计不重复的数据数量。
比如我们需要统计用户表中不重复的城市数量,就可以结合COUNT函数使用:
-- 统计不重复的城市数量 SELECT COUNT(DISTINCT city) AS city_count FROM user_info;
这里的COUNT(DISTINCT city)会先对city列进行去重,再统计去重后的数量,返回的结果就是不同城市的总数。
DISTINCT使用注意事项
- DISTINCT作用于所有查询列,不能只对部分列生效,比如
SELECT username, DISTINCT city FROM user_info这种写法是错误的。 - DISTINCT不会忽略NULL值,如果列中存在NULL值,去重后NULL值只会保留一个。
- DISTINCT的去重逻辑是对所有行的所有指定列值进行比对,数据量较大时可能会影响查询性能,需要根据实际情况合理使用。
- DISTINCT和ORDER BY配合使用时,ORDER BY后面的列必须是查询中出现的列,否则会报错。
常见误区说明
很多用户会误以为DISTINCT可以对不同列分别去重,比如想同时得到去重后的username和去重后的city,这种需求无法通过一个DISTINCT语句实现,需要分别写两个查询语句:
-- 分别查询去重后的用户名和城市 SELECT DISTINCT username FROM user_info; SELECT DISTINCT city FROM user_info;
另外DISTINCT不是用来过滤重复表的,它只作用于查询结果的行,不会对原表的数据做任何修改。