mysql中distinct和group by的区别浅析

 更新时间:2023年05月29日 09:50:35   作者:liulanba  
distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,下面这篇文章主要给大家介绍了关于mysql中distinct和group by区别的相关资料,需要的朋友可以参考下

GROUP BY 和 DISTINCT 都是用于从数据库中选择唯一值的 SQL 子句。它们之间的主要区别在于它们的作用方式和应用场景。

GROUP BY 语句用于将数据按照一个或多个列进行分组,然后对每个组应用一个聚合函数(如 COUNT、SUM、AVG 等)以得到每个组的统计结果。GROUP BY 通常用于在查询中生成汇总信息。例如:

SELECT category, COUNT(*) AS count
FROM products
GROUP BY category;

以上查询会按照商品类别将数据分组,并统计每个类别的商品数量。

DISTINCT 语句用于从查询结果中选择唯一的值。它可以用于从一个或多个列中选择唯一的值,也可以用于选择整行的唯一值。例如:

SELECT DISTINCT category
FROM products;

以上查询会返回所有不同的商品类别。

总的来说,GROUP BY 用于对数据进行分组和聚合操作,DISTINCT 则用于选择唯一的值。GROUP BY 通常用于在查询中生成汇总信息,而 DISTINCT 则用于选择不同的值以进行数据清理或统计。

此外,GROUP BY 通常会产生比 DISTINCT 更多的结果,因为它按照指定的列进行分组,而每个分组内可能包含多个不同的值。例如,在以下查询中:

SELECT category, supplier
FROM products
GROUP BY category;

结果会按照商品类别分组,并且对于每个类别,会返回该类别下的任意一条记录中的供应商信息。这意味着如果一个类别下有多个供应商,那么在结果中会出现多条记录,而这些记录的商品类别相同但供应商不同。

与之相比,以下查询使用 DISTINCT 选择了不同的商品类别和供应商:

SELECT DISTINCT category, supplier
FROM products;

在这种情况下,每个组合(商品类别和供应商)只会出现一次。

需要注意的是,GROUP BY 和 DISTINCT 都会对查询的性能产生一定的影响。GROUP BY 可能会需要对数据进行排序和分组操作,而这些操作需要消耗更多的 CPU 和内存资源。因此,在使用 GROUP BY 时需要谨慎,尽可能选择合适的索引和优化查询语句,以减少查询的时间和资源消耗。而 DISTINCT 则通常比 GROUP BY 更快,因为它只需要对结果集进行唯一化处理即可。

有索引的情况下:group by和distinct都能使用索引,效率相同。

无索引的情况下:distinct效率高于group by,因为GROUP BY 可能会需要对数据进行排序和分组操作。

附:distinct 和 group by 原理

在大多数例子中,DISTINCT可以被看作是特殊的GROUP BY,它们的实现都基于分组操作,且都可以通过松散索引扫描、紧凑索引扫描(关于索引扫描的内容会在其他文章中详细介绍,就不在此细致介绍了)来实现。

DISTINCT和GROUP BY都是可以使用索引进行扫描搜索的。例如以下两条 sql(只单单看表格最后 extra 的内容),我们对这两条 sql 进行分析,可以看到,在 extra 中,这两条 sql 都使用了紧凑索引扫描Using index for group-by。

所以,在一般情况下,对于相同语义的DISTINCT和GROUP BY语句,我们可以对其使用相同的索引优化手段来进行优化。

但对于GROUP BY来说,在 MYSQL8.0 之前,GROUP Y默认会依据字段进行隐式排序。

可以看到,下面这条 sql 语句在使用了临时表的同时,还进行了 filesort。

总结

到此这篇关于mysql中distinct和group by区别浅析的文章就介绍到这了,更多相关mysql distinct和group by区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 优化 index merge引起的死锁分析

    MySQL 优化 index merge引起的死锁分析

    这篇文章主要介绍了MySQL 优化 index merge引起的死锁分析,MySQL通过优化索引合并是遇到的死锁问题,下面具体分析需要的小伙伴可以参考一下
    2022-04-04
  • MySQL切分查询用法分析

    MySQL切分查询用法分析

    这篇文章主要介绍了MySQL切分查询用法,结合实例形式分析了通过do while语句进行切分查询的具体实现技巧,需要的朋友可以参考下
    2016-04-04
  • SQL语句中EXISTS的详细用法大全

    SQL语句中EXISTS的详细用法大全

    最近重新用到了exists关键字,对于其基本用法记录一下,下面这篇文章主要给大家介绍了关于SQL语句中EXISTS的详细用法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • MySQL的binlog日志使用详解

    MySQL的binlog日志使用详解

    这篇文章主要介绍了MySQL的binlog日志使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MySQL中字符串索引对update的影响分析

    MySQL中字符串索引对update的影响分析

    这篇文章主要介绍了MySQL中字符串索引对update的影响,结合实例形式分析了添加索引操作对于update语句的性能所造成的影响,需要的朋友可以参考下
    2016-04-04
  • 快速解决mysql深分页问题

    快速解决mysql深分页问题

    这篇文章主要介绍了优雅地解决mysql深分页问题,本文将会讨论当mysql表大数据量的情况,如何优化深分页问题,并附上最近的优化慢sql问题的案例伪代码,需要的朋友可以参考下
    2022-07-07
  • 解决MySQL server has gone away错误的方案

    解决MySQL server has gone away错误的方案

    在本篇文章里小编给大家分享的是一篇关于MySQL server has gone away错误的解决办法,有需要的朋友们可以参考下。
    2020-02-02
  • mysql分表之后如何平滑上线详解

    mysql分表之后如何平滑上线详解

    项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多,以至于查询书读变慢,当出现这种情况时,我们可以考虑分表,这篇文章主要给大家介绍了关于mysql分表之后如何平滑上线的相关资料,需要的朋友可以参考下
    2021-10-10
  • 深度解析MySQL 5.7之临时表空间

    深度解析MySQL 5.7之临时表空间

    尽管临时表在实际在线场景中很少会去显式使用,但在某些运维场景还是需要到的,在MySQL5.7中,专门针对临时表做了些优化,下面这篇文章我们来一起深入的解析MySQL 5.7之临时表空间,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • mysql实现将date字段默认值设置为CURRENT_DATE

    mysql实现将date字段默认值设置为CURRENT_DATE

    这篇文章主要介绍了mysql实现将date字段默认值设置为CURRENT_DATE问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论