【GROUP BY与 DISTINCT的区别和选择】

351 阅读2分钟

写在前面

都具有分组的作用,但是推荐使用GROUP BY ,原因写在下面。

GROUP BY (分组/去重)

······用于对选定字段列进行分组。它会先根据后接字段进行排序,之后保留第一行数据以实现去重。

SELECT  age FRON  table GROUP  BY age        
//对age列进行分组,实质上会先根据她进行排序,然后选择第一行,能使用索引则使用索引,由此引出效率问题。

优势

  1. GROUP BY 在有索引的情况下可以使用索引
  2. GROUP BY 操作场景更加广泛;

劣势

在MySQL8.0之前,GROUP BY不仅仅具有分组的作用,实际上他还会根据后接字段进行隐式排序。如果在无法使用索引排序的情况下,GROUP BY语句的效率会变得很低。

DISTINCT (去重)

用于返回唯一且不同的值。 对关键字 DISTINCT后接所有字段生效,所以说 使用GROUP BY 更加丰富多样,适应更多需求。 对于多列去重,即所有被指定的字段列的值都相同,才会被认为是重复列。

SELECT  DISTINCT age FRON  table         
//对age列进行去重,默认使用索引。
SELECT  DISTINCT age,name FRON  table 
//只有age,name两列的值都不同时才会认为是重复。所以DISTINCT是针对后接所有列

注: DISTINCT也会使用索引。

总结

  1. 使用索引的情况下,两者效率基本相同,且 GROUP BY 的使用范围更加广泛,所以选择使用 GROUP BY。
  2. 在不使用索引的情况下,如果是MySQL8以前,肯定能使用DISTINCT则不适用GROUP BY,但是如果使用 MySQL8以及之后版本,则考虑到它的多用性,使用GROUP BY。

综上所述,我们尽量使用GROUP BY而不是 DISTINCT。