mysql中distinct和group by去重的区别
在mysql中,我们经常需要对查询结果进行去重,而distinct和group by是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用,但它们之间还是存在一些差异的。接下来,我们将通过创建测试数据和执行不同的查询来探讨这两种方法的区别。
创建测试数据
首先,我们创建一个测试表pageview,并插入一些数据:
sql代码:
-- 创建测试表
drop table if exists pageview;
create table pageview (
id bigint primary key auto_increment comment '自增主键',
aid bigint not null comment '文章id',
uid bigint not null comment '(访问)用户id',
createtime datetime default now() comment '创建时间'
) default charset='utf8mb4';
-- 添加测试数据
insert into pageview(aid, uid) values(1, 1);
insert into pageview(aid, uid) values(1, 1);
insert into pageview(aid, uid) values(2, 1);
insert into pageview(aid, uid) values(2, 2);distinct使用
distinct的基本语法如下:
select distinct column_name, column_name from table_name;
单列去重
根据aid(文章id)去重:
sql代码:
select distinct aid from pageview;
多列去重
根据aid和uid联合去重:
sql代码:
select distinct aid, uid from pageview;
聚合函数+去重
使用distinct+聚合函数计算aid去重之后的总条数:
sql代码:
select count(distinct aid) from pageview;
group by使用
group by的基础语法如下:
select column_name, column_name from table_name group by column_name;
单列去重
根据aid去重:
sql代码:
select aid from pageview group by aid;
与distinct相比,group by可以显示更多的列,而distinct只能展示去重的列。
多列去重
根据aid和uid联合去重:
sql代码:
select aid, uid from pageview group by aid, uid;
聚合函数 + group by
统计每个aid的总数量:
sql代码:
select aid, count(*) from pageview group by aid;
distinct和group by的区别
查询结果集不同
使用distinct去重时,查询结果集中只有去重列信息。而使用group by可以查询一个或多个字段。
使用业务场景不同
统计去重之后的总数量需要使用distinct,而统计分组明细或在分组明细的基础上添加查询条件时,就得使用group by。
性能不同
如果去重的字段有索引,那么group by和distinct都可以使用索引,此情况下它们的性能是相同的。而当去重的字段没有索引时,distinct的性能可能会高于group by,因为在mysql 8.0之前,group by有一个隐藏的功能会进行默认的排序,这样就会触发filesort从而导致查询性能降低。
总结
大部分场景下distinct是特殊的group by,但二者也有细微的区别,比如它们在查询结果集上、使用的具体业务场景上,以及性能上都是不同的。了解这些差异可以帮助我们根据实际需求选择更合适的方法。
到此这篇关于mysql中distinct和group by去重的区别的文章就介绍到这了,更多相关mysql distinct和group by去重内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论