mysql中的DISTINCT 和 GROUP BY有啥区别与联系

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

文章可能会比较长,主要解析的非常详解,或涉及一些底层知识,供面试高阶难度用。可以根据自己实际理解情况合理取舍阅读

在 MySQL 中,DISTINCT 和 GROUP BY 都是用于处理查询结果的聚合和去重操作,但它们在语义和使用场景上有明显的区别。下面是它们的共同点与区别。

01
共同点


去重功能:
两者都可以用来去除重复的结果行。DISTINCT 去除重复行,GROUP BY 通过分组的方式,也会将重复的记录归为一组,从而实现去重。

常常用在 SELECT 语句中:
DISTINCT 和 GROUP BY 都通常用于 SELECT 语句中,以控制结果集中的重复数据。

示例:

SELECT DISTINCT department FROM employees;
SELECT department FROM employees GROUP BY department;

以上两个sql执行结果一致。留一个问题,那么哪一个的效率会更高呢?



02
区别


基本功能与用途:

DISTINCT:主要用于返回唯一不同的值。它作用于查询的全部字段,返回的是所有字段组合去重后的唯一记录。例如:

SELECT DISTINCT column1, column2 FROM table;

该查询返回的是 column1 和 column2 的组合去重后的结果。

GROUP BY:主要用于将数据按某一字段进行分组,并且常常配合聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN() 等)一起使用。GROUP BY 的本质是对数据进行分组,而不是单纯去重。例如:

SELECT column1, COUNT(*FROM table GROUP BY column1;

该查询会根据 column1 对记录进行分组,并统计每个组的行数。

处理方式:

DISTINCT:直接去重,针对查询结果中的每一列,去掉重复的记录。

GROUP BY:是通过对某个或多个字段进行分组来聚合数据。即使没有聚合函数,GROUP BY 也会使数据按指定的字段分组,从而去重。

聚合函数的使用:

DISTINCT:通常不会直接与聚合函数结合使用,但可以用在聚合函数中,比如:

SELECT COUNT(DISTINCT column1) FROM table;

该查询统计 column1 的唯一值的数量。

GROUP BY:常常与聚合函数一起使用,如 COUNT(), SUM(), AVG() 等。例如:

SELECT column1, SUM(column2) FROM table GROUP BY column1;

该查询会根据 column1 分组并计算每组的 column2 总和。


返回结果的不同:

DISTINCT:返回的是去重后的完整行,每行的每个字段的组合必须唯一。

GROUP BY:返回的是每个分组的摘要数据。如果不使用聚合函数,它将返回每个分组的第一个或唯一记录(具体取决于数据库的实现和排序方式)。


适用场景:

DISTINCT:适用于简单的去重操作,尤其是当你只关心某些列的唯一性时。

GROUP BY:适用于需要按某些列对数据进行分组并执行聚合操作的场景,或者需要计算每个组的统计信息时。


03
示例对比


DISTINCT 示例:

SELECT DISTINCT department FROM employees;

该查询返回所有不同的部门名称,重复的部门会被去掉。

GROUP BY 示例:

SELECT department, COUNT(*FROM employees GROUP BY department;

该查询按部门分组,并统计每个部门的员工数量。


04
总结


  • DISTINCT 是用来去重的,而 GROUP BY 用于分组并且通常结合聚合函数来使用。

  • 如果只是想去重某些列的记录,使用 DISTINCT 更简洁;而如果需要按某列分组并计算统计信息,使用 GROUP BY 会更合适。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

《Java面试题指南》回归啦~


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch