作者|雷哥来源|Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在MySQL中,最常见的去重方式有两种:使用distinct或者使用groupby,那么有什么区别呢?接下来我们一起来看看吧。1.创建测试数据--创建测试表droptableifexistspageview;createtablepageview(idbigintprimarykeyauto_incrementcomment'自增主键',aidbigintnotnullcomment'articleID',uidbigintnotnullcomment'(access)userID',createtimedatetimedefaultnow()comment'creationtime')defaultcharset='utf8mb4';--添加测试数据insertintopageview(aid,uid)values(1,1);insertintopageview(aid,uid)values(1,1);insertintopageview(aid,uid)values(2,1);insertintopageview(aid,uid)values(2,2);最终显示效果如下:2.distinct使用distinctbasic语法如下:SELECTDISTINCTcolumn_name,column_nameFROMtable_name;(1)单列去重我们先用distinct实现单列去重,根据aid(文章ID)去重,具体实现是如下:(2)除单列去重外的多列去重此外,distinct还支持多列去重ple列(两列或更多列)。我们根据aid(文章ID)和uid(用户ID)联合去重。具体实现如下:(3)聚合函数+使用distinct去重+聚合函数去重,计算aid去重后的总项数,具体实现如下:3.groupbygroupby的基本语法如下如下:SELECTcolumn_name,column_nameFROMtable_nameWHEREcolumn_nameoperatorvalueGROUPBYcolumn_name(1)基于aid(文章ID)去重的单列去重,具体实现如下:groupby与distinct相比,可以显示更多的列,而distinct只能显示去重列。(2)多列去重根据aid(文章ID)和uid(用户ID)联合去重,具体实现如下:(3)聚合函数+groupby统计每个aid的总数,以及SQL实现如下:从上面的结果可以看出,使用groupby和distinctpluscount的查询语义是完全不同的。distinct+count统计去重后的总数,groupby+count统计每组数据分组后的总数。4.distinct和groupby的区别官方文档在描述distinct时提到:在大多数情况下,distinct是一种特殊的groupby,如下图:官方文档地址:https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html但是两者还是有一些细微的差别,比如下面的。区别一:查询结果集不同。使用distinct去重时,查询结果集只有去重信息,如下图:当你尝试添加非去重字段(查询)时,SQL会报错如下图:whileOne或者多个字段可以通过groupbysorting来查询,如下图:区别二:使用不同的业务场景统计去重后的总量需要使用distinct,统计分组明细,或者添加查询条件based在组详细信息上,您必须使用groupby。使用distinct统计去重后一列的总数:统计分组后数量大于2的文章,需要使用groupby,如下图:差异3:性能不同如果去重字段有一个索引,那么groupby和distinct都可以使用索引,在这种情况下它们的性能是一样的;而当去重字段没有索引时,distinct的性能会比groupby高,因为在MySQL8.0之前,groupby有一个隐藏的功能,会进行默认排序,会触发filesort,导致查询性能下降降级。综上所述,distinct在大多数场景下是一种特殊的groupby,但两者也有细微的区别,比如查询结果集、使用的具体业务场景、性能等方面的不同。
