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性能优化之索引下推

    Mysql性能优化之索引下推

    这篇文章主要介绍了Mysql性能优化之索引下推,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MySQL-8.0.26配置图文教程

    MySQL-8.0.26配置图文教程

    最近公司项目更换数据库版本,在此记录分享一下自己安装配置MySQL8.0版本的过程吧,本文通过图文并茂的形式给大家介绍的非常详细,对MySQL-8.0.26配置教程感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 浅谈Mysql大数据分页查询解决方案

    浅谈Mysql大数据分页查询解决方案

    本文主要介绍了浅谈Mysql大数据分页查询解决方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • MySql中having字句对组记录进行筛选使用说明

    MySql中having字句对组记录进行筛选使用说明

    having字句可以让我们筛选成组后的各种数据
    2012-12-12
  • MySQL导出sql脚本文件操作指南

    MySQL导出sql脚本文件操作指南

    mysql数据库是非常常用的一种数据库,属于中小型数据库,常用于网站业务和一些WEB系统业务,下面这篇文章主要给大家介绍了关于MySQL导出sql脚本文件操作的相关资料,需要的朋友可以参考下
    2023-01-01
  • mysql中的7种日志小结

    mysql中的7种日志小结

    这篇文章主要介绍了mysql中的7种日志小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MAC下修改mysql默认字符集为utf8的方法

    MAC下修改mysql默认字符集为utf8的方法

    本文主要介绍了如何修改MAC版mysql默认字符集为utf8,如果你的MAC版mysql字符乱码,可以参考一下这篇文章
    2018-03-03
  • MySQL默认sql_mode浅析

    MySQL默认sql_mode浅析

    这篇文章主要为大家介绍了MySQL默认sql_mode浅析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

    Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

    这篇文章主要介绍了Window下如何恢复被删除的Mysql8.0.17 Root账户及密码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • MySQL在哪些情况下不使用索引的示例

    MySQL在哪些情况下不使用索引的示例

    尽管索引可以显著提高数据库的查询性能,但在某些情况下,MySQL可能不会使用索引,本文就来介绍一下MySQL在哪些情况下不使用索引,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论