在mysql的查询操作中,当我们需要从表中获取不重复的记录时,distinct是最常用的关键字之一,它可以过滤掉查询结果中重复的行,只保留唯一的记录。distinct的使用场景非常广泛,比如统计表中不重复的用户数量、获取某个字段的所有不同取值等。
distinct基本语法
distinct的基本使用语法非常简单,直接放在select关键字的后面即可,语法格式如下:
-- 单字段去重语法 SELECT DISTINCT 字段名 FROM 表名; -- 多字段去重语法 SELECT DISTINCT 字段1, 字段2 FROM 表名;
需要注意的是,distinct必须放在所有查询字段的最前面,不能放在某个字段的中间位置,否则会触发语法错误。
单字段去重示例
假设我们有一张用户表user,表结构如下:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);
-- 插入测试数据
INSERT INTO user (name, age, city) VALUES
('张三', 20, '北京'),
('李四', 22, '上海'),
('张三', 25, '广州'),
('王五', 20, '北京'),
('李四', 22, '上海');
如果我们想要获取表中所有不重复的用户名,就可以使用单字段distinct查询:
SELECT DISTINCT name FROM user;
查询结果会返回三条记录,分别是张三、李四、王五,重复的张三和李四记录会被过滤掉。
多字段去重示例
distinct作用于多个字段时,是对多个字段的组合进行去重,只有当所有指定字段的值都相同时,才会被判定为重复记录。比如我们想要获取表中不重复的姓名和年龄组合:
SELECT DISTINCT name, age FROM user;
上述查询的结果会返回四条记录,分别是(张三,20)、(李四,22)、(张三,25)、(王五,20),因为(张三,20)和(张三,25)的年龄不同,所以不会被判定为重复,(李四,22)和(李四,22)完全重复,只会保留一条。
distinct和聚合函数搭配使用
distinct经常和count函数搭配使用,用来统计某个字段的不重复值的数量。比如统计user表中不重复的用户名数量:
SELECT COUNT(DISTINCT name) AS unique_user_count FROM user;
查询结果会返回3,对应三个不同的用户名。需要注意的是,count(distinct 字段名)的写法中,distinct必须放在count函数的括号内,不能写成DISTINCT COUNT(name),后者会先统计所有记录的数量再去重,不符合预期。
使用distinct的注意事项
- distinct作用于null值的时候,会将所有的null值视为相同的值,只保留一个null记录。
- 如果查询的字段中包含主键,那么使用distinct是没有意义的,因为主键本身就是唯一的,不会存在重复记录。
- distinct的查询效率相对较低,如果表的数据量非常大,建议结合索引使用,或者考虑使用group by来实现去重,group by在某些场景下效率会更高。
- distinct只能用在select语句中,不能用在insert、update、delete等其他语句中。
distinct和group by的区别
很多场景下distinct和group by都可以实现去重效果,比如单字段去重:
-- 使用distinct去重 SELECT DISTINCT city FROM user; -- 使用group by去重 SELECT city FROM user GROUP BY city;
这两种写法的查询结果是一致的,但是group by的功能更强大,可以搭配聚合函数实现分组统计,而distinct只能实现单纯的去重。如果只是需要去重查询,两者都可以使用,根据实际场景选择即可。