2026-10-21 15:44:05
功能:DISTINCT 是一种用于去除 SELECT 语句返回结果中重复行的关键字。在使用 SELECT 语句查询数据时,如果结果集中包含重复的行,可以使用 SELECT DISTINCT 语句来去除这些重复的行。
使用:
DISTINCT 关键词用于返回唯一不同的值,放在查询语句中的第一个字段前使用,且作用于主句所有列。
示例:SELECT DISTINCT column1 FROM table_name;
示例:SELECT DISTINCT column1, column2 FROM table_name WHERE where_conditions;
功能:GROUP BY 主要的使用场景是在分组聚合。具体来说,GROUP BY 子句通常用于将查询结果按照一个或多个列进行分组,然后对每个组进行聚合计算。
使用:
通常与聚合函数(例如 COUNT、SUM、AVG、MAX 和 MIN)一起使用,以计算每个组的聚合值。
单列去重:SELECT column1, COUNT(*) as num FROM table_name GROUP BY column1;
多列去重:SELECT column1, column2, COUNT(*) as num FROM table_name GROUP BY column1, column2;
distinct的底层原理:
group by的底层原理:
创建内存临时表,表里有分组字段和聚合字段。
扫描原表,依次取出一行数据,根据分组字段的值判断临时表中是否存在该分组。
如果不存在,则插入一条新记录;如果存在,则更新该记录的聚合值。
遍历完后,再根据分组字段进行排序(在 MySQL 8.0 之前默认会排序,但 8.0 之后已弃用此隐式排序行为)。
最后将结果集返回给客户端。
distinct和group by去重原理分析:
GROUP BY 和 DISTINCT 都能使用索引,效率相同。
在 MySQL 8.0 之前,由于 GROUP BY 会进行隐式排序,导致触发 filesort,SQL 执行效率低下。而 DISTINCT 不会进行排序操作,因此效率高于 GROUP BY。
从 MySQL 8.0 开始,MySQL 删除了 GROUP BY 的隐式排序行为,所以此时在语义相同、无索引的情况下,GROUP BY 和 DISTINCT 的执行效率也是近乎等价的。
综上所述,DISTINCT 和 GROUP BY 在功能和使用上有所区别,但在底层原理上存在一定的联系。在实际应用中,应根据具体场景和需求选择合适的关键字来优化查询性能。