在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.distinctusedistinctbasic语法如下:SELECTDISTINCTcolumn_name,column_nameFROMtable_name;2.1单列去重我们先用distinct实现单列去重,根据aid(文章ID)去重,具体实现如下:2.2多列去重除了单列去重外,distinct还支持多列(两列或多列)去重。我们根据aid(文章ID)和uid(用户ID)联合去重。具体实现如下:2.3聚合函数+去重使用distinct+聚合函数去重,计算aid去重后的条目总数具体实现如下:3.groupby使用group的基本语法如下:SELECTcolumn_name,column_nameFROMtable_nameWHEREcolumn_nameoperatorvalueGROUPBYcolumn_name3.1单列去重是基于aid(文章ID),具体实现如下:groupby相比distinct,可以显示更多的列,而distinct只能显示去重列。3.2多列去重根据aid(文章ID)和uid(用户ID)联合去重,具体实现如下:3.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会报错如下图:whileOneormultifields可以使用groupbysorting查询,如下图:区别二:不同业务场景去重统计后的总数需要使用distinct,统计分组明细,或者根据分组细节,你必须使用分组依据。使用distinct统计去重后一列的总数:统计分组后数量大于2的文章,需要使用groupby,如下图:差异3:性能不同如果去重字段有一个索引,那么groupby和distinct都可以使用索引,在这种情况下它们的性能是一样的;而当去重字段没有索引时,distinct的性能会比groupby高,因为在MySQL8.0之前,groupby有一个隐藏的功能,会进行默认排序,会触发filesort,导致查询性能下降降级。综上所述,distinct在大多数场景下是一种特殊的groupby,但两者也有细微的区别,比如查询结果集、使用的具体业务场景、性能等方面的不同。Reference&Acknowledgeszhuanlan.zhihu.com/p/384840662判断是非在自己,听别人说,得失看数字。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
