面试官:GROUP BY和DISTINCT有什么区别?

数据库 MySQL
GROUP BY 和 DISTINCT 都可以使用索引,此情况它们的性能是相同的;而当去重的字段没有索引时,DISTINCT 的性能就会高于 GROUP BY,因为在 MySQL 8.0 之前,GROUP BY 有一个隐藏的功能会进行默认的排序,这样就会触发 filesort 从而导致查询性能降低。

在 MySQL 中,GROUP BY 和 DISTINCT 都是用来处理查询结果中的重复数据,并且在官方的描述文档中也可以看出:在大多数情况下 DISTINCT 是特殊的 GROUP BY,如下图所示:

官方文档地址:https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html

但二者还是有一些细微的不同,接下来一起来看。

1.DISTINCT 介绍

  • 用途:DISTINCT 用于从查询结果中去除重复的行,确保返回的结果集中每一行都是唯一的。
  • 语法:通常用于 SELECT 语句中,紧跟在 SELECT 关键字之后。例如以下  SQL:
SELECT DISTINCT column1, column2 FROM table_name;
  • 工作机制:DISTINCT 会对整个结果集进行去重,即只要结果集中的某一行与另一行完全相同,就会被去除。

2.GROUP BY 介绍

  • 用途:GROUP BY 主要用于对结果集按照一个或多个列进行分组,通常与聚合函数(如 COUNT, SUM, AVG, MAX, MIN 等)一起使用,以便对每个组进行统计。
  • 语法:GROUP BY 通常跟在 FROM 或 WHERE 子句之后,在 SELECT 语句的末尾部分。例如以下  SQL:
SELECT column1, COUNT(*) FROM table_name GROUP BY column1;
  • 工作机制:GROUP BY 将数据按指定的列进行分组,每个组返回一行数据。

3.举例说明

(1)使用 DISTINCT

假设有一个表 students,包含以下数据:

id

name

age

1

Alice

20

2

Bob

22

3

Alice

20

使用 DISTINCT 去除重复行:

SELECT DISTINCT name, age FROM students;

结果:

name

age

Alice

20

Bob

22

(2)使用 GROUP BY

假设还是上面的表 students,我们想要统计每个学生的数量:

SELECT name, COUNT(*) AS count FROM students GROUP BY name;

结果:

name

count

Alice

2

Bob

1

4.主要区别

  • 功能不同:DISTINCT 用于去除重复行,而 GROUP BY 用于对结果集进行分组,通常与聚合函数一起使用。
  • 返回结果不同:DISTINCT 返回去重后的结果集,查询结果集中只能包含去重的列信息,有其他列信息会报错;GROUP BY 返回按指定列分组后的结果集,可以展示多列信息,并可以包含聚合函数的计算结果。
  • 应用场景不同:DISTINCT 更适合单纯的去重需求,GROUP BY 更适合分组统计需求。
  • 性能略有不同:如果去重的字段有索引,那么 GROUP BY 和 DISTINCT 都可以使用索引,此情况它们的性能是相同的;而当去重的字段没有索引时,DISTINCT 的性能就会高于 GROUP BY,因为在 MySQL 8.0 之前,GROUP BY 有一个隐藏的功能会进行默认的排序,这样就会触发 filesort 从而导致查询性能降低。
责任编辑:姜华 来源: 磊哥和Java
相关推荐

2024-04-03 15:33:04

JWTSession传输信息

2023-02-17 08:10:24

2021-12-10 12:01:37

finalfinallyfinalize

2021-11-30 07:44:50

FinalFinallyFinalize

2021-12-13 06:56:45

Comparable元素排序

2024-03-20 15:12:59

KafkaES中间件

2021-12-23 07:11:31

开发

2023-07-11 08:40:02

IO模型后台

2023-02-09 07:01:35

转发重定向Java

2024-03-26 16:24:46

分布式事务2PC3PC

2023-12-13 13:31:00

useEffect对象浏览器

2023-02-20 07:19:14

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2021-12-27 06:57:40

This SuperJava

2023-12-05 09:33:08

分布式事务

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2022-08-22 07:06:32

MyBatisSQL占位符

2021-07-08 06:51:29

React函数组件

2022-08-03 07:04:56

GETHTTPPOST

2022-04-24 07:59:53

synchronizJVMAPI
点赞
收藏

51CTO技术栈公众号