首页
学习
活动
专区
圈层
工具
发布

MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别 在MySQL中,我们经常需要对查询结果进行去重,而DISTINCT和GROUP BY是实现这一功能的两种常见方法。...: SELECT aid FROM pageview GROUP BY aid; 与DISTINCT相比,GROUP BY可以显示更多的列,而DISTINCT只能展示去重的列。...: SQL代码: SELECT aid, COUNT(*) FROM pageview GROUP BY aid; distinct和group by的区别 查询结果集不同 使用DISTINCT去重时,...而使用GROUP BY可以查询一个或多个字段。 使用业务场景不同 统计去重之后的总数量需要使用DISTINCT,而统计分组明细或在分组明细的基础上添加查询条件时,就得使用GROUP BY。...而当去重的字段没有索引时,DISTINCT的性能可能会高于GROUP BY,因为在MySQL 8.0之前,GROUP BY有一个隐藏的功能会进行默认的排序,这样就会触发filesort从而导致查询性能降低

77000

MySQL中的数据去重,该用DISTINCT还是GROUP BY?

在MySQL数据库操作中,数据去重是常见的需求。当我们需要从查询结果中排除重复记录时,通常会面临两个选择:使用DISTINCT关键字或GROUP BY子句。...,通常通过创建临时表或使用文件排序来实现 GROUP BY:MySQL先按指定列分组,然后从每个组中选择一行(通常是非聚合列的第一行) 实际性能测试 我们通过一个包含10万条记录的测试表进行性能对比:...-- 计算不同部门的数量 SELECT COUNT(DISTINCT department_id) FROM employees; 子查询中的去重 -- 在子查询中使用DISTINCT SELECT...合适的索引都能显著提升性能 **避免SELECT ***:只选择需要的列,减少数据处理量 考虑数据分布:对于高基数(唯一值多)的列,去重操作代价更高 结论 在MySQL中,DISTINCT和GROUP...选择DISTINCT:当你的需求纯粹是去重,且代码可读性是重要考虑因素时 选择GROUP BY:当去重的同时还需要聚合计算或分组过滤时 实际开发中,建议根据具体需求选择最合适的工具,同时通过EXPLAIN

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL中的数据去重,该用DISTINCT还是GROUP BY?

    在日常工作中,数据库查询操作无处不在,而处理数据中的重复项与分组汇总是非常常见的需求。 MySQL 提供了两种常见的方式来管理和检索唯一值:SELECT DISTINCT 和 GROUP BY。...在DISTINCT中,NULL 被视为一个独立的值,因此即使列中有多个 NULL 值,结果中只会保留一个 NULL。...DISTINCT与GROUP BY使用对比 示例 1:检索唯一的客户城市 场景:我们希望查询 customers 表中的唯一城市,不关心重复的城市名称。...mysql> explain select int1_index from test_distinct_groupby group by int1_index; 两者结果中 Extra 字段显示 Using...否(可选) 是(默认排序,8.0后优化) 性能 无索引场景更高效 无索引场景稍慢(排序) 语法复杂度 简单 较复杂 适用场景 根据具体需求选择 DISTINCT 或 GROUP BY: 使用SELECT

    36700

    面试官:MySQL 中的 distinct 和 group by 哪个效率更高?

    基于这个结论,你可能会问: 为什么在语义相同,有索引的情况下,group by和distinct效率相同? 在什么情况下,group by会进行排序操作? 带着这两个问题找答案。...distinct的使用 distinct用法 SELECT DISTINCT columns FROM table_name WHERE where_conditions; 例如: mysql> select...,group by可以进行单列去重,group by的原理是先对结果进行分组排序,然后返回每组中的第一条数据。...,DISTINCT可以被看作是特殊的GROUP BY,它们的实现都基于分组操作,且都可以通过松散索引扫描、紧凑索引扫描(关于索引扫描的内容会在其他文章中详细介绍,就不在此细致介绍了)来实现。...且由于distinct关键字会对所有字段生效,在进行复合业务处理时,group by的使用灵活性更高,group by能根据分组情况,对数据进行更为复杂的处理,例如通过having对数据进行过滤,或通过聚合函数对数据进行运算

    2.2K10

    MySQL中的GROUP BY和DISTINCT:去重的效果与用法解析

    在MySQL数据库中,经常会遇到需要对数据进行分组和去重的情况。为了达到这个目的,我们通常会使用GROUP BY和DISTINCT这两个关键字。虽然它们都可以用于去重,但是它们具有不同的用法和效果。...本文将详细解析MySQL中的GROUP BY和DISTINCT的用法,并比较它们对同一字段的去重效果是否相同。...一、GROUP BY的用法及效果GROUP BY关键字用于将结果集按照一个或多个列进行分组,并对每个组应用聚合函数。...可以使用以下的SQL语句来实现:SELECT DISTINCT cityFROM students;上述代码中,通过SELECT DISTINCT city,我们将从students表格中选择并返回所有不重复的城市名...结论通过本文的介绍,我们了解了Mysql中的Group和Distinct的用法,并对它们进行了比较和对比。Group By关键字用于将结果集按照指定的字段进行分组,适用于分组计算和聚合操作。

    11.2K50

    京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?太刁钻了吧!

    基于这个结论,你可能会问: 为什么在语义相同,有索引的情况下,group by和distinct效率相同? 在什么情况下,group by会进行排序操作? 带着这两个问题找答案。...distinct的使用 distinct用法 SELECT DISTINCT columns FROM table_name WHERE where_conditions; 例如: mysql> select...,group by可以进行单列去重,group by的原理是先对结果进行分组排序,然后返回每组中的第一条数据。...,DISTINCT可以被看作是特殊的GROUP BY,它们的实现都基于分组操作,且都可以通过松散索引扫描、紧凑索引扫描(关于索引扫描的内容会在其他文章中详细介绍,就不在此细致介绍了)来实现。...且由于distinct关键字会对所有字段生效,在进行复合业务处理时,group by的使用灵活性更高,group by能根据分组情况,对数据进行更为复杂的处理,例如通过having对数据进行过滤,或通过聚合函数对数据进行运算

    2.5K30

    MySQL遇见SELECT list is not in GROUP BY clause and contains nonaggre的问题

    目录 报错现象 原因 解决方法 报错现象 执行SQL报错如下: SELECT student.s_no,student.s_name,SUM(result.mark) FROM student,result...WHERE student.s_no=result.s_no GROUP BY student.s_no > 1055 - Expression #2 of SELECT list is not in...如果启用了ONLY_FULL_GROUP_BY SQL模式(默认开启),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们...(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。)...解决方法 方法一 使用命令行或者数据库客户端执行SQL 1.SQL语句,select @@global.sql_mode查询 mysql> select @@global.sql_mode; +--

    3.5K30

    MySQL出现SELECT list is not in GROUP BY clause and contains nonaggre的问题

    报错如下: Expression #2 of SELECT list is not in GROUP BY clause and contains  nonaggregated column ‘...with  sql_mode=only_full_group_by 问题出现的原因: MySQL 5.7.5及以上功能依赖检测功能。...如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们...(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见“MySQL 5.6参考手册”。)...解决方法一: 打开navcat, 用sql查询: select @@global.sql_mode 查询出来的值为: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES

    6.3K00

    MySQL中 concat() 以及 group_concat() 的使用

    例2:在例1的结果中三个字段 id, username, password 的组合没有分隔符,我们可以加一个逗号作为分隔符: select concat (id, ',', username, ',',...这样看上去似乎顺眼了许多~~ 但是输入sql语句麻烦了许多,三个字段需要输入两次逗号,如果10个字段,要输入九次逗号...麻烦死了啦,有没有什么简便方法呢?...三、group_concat()函数 前言:在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。...例5:查询该数据并根据性别分组: select sex, id, username from my_test group by sex; ?...——使用group_concat() 例6:查询数据分组并获取每个组别中详细的数据: select sex, group_concat(id) as ids, group_concat(username

    3.8K30

    MySQL 怎么用索引实现 group by?

    本文我们一起来探寻 MySQL 使用索引实现 group by 的过程,使用临时表实现 group by 会单独用一篇文章来介绍。 本文内容基于 MySQL 5.7.35 源码。...松散索引扫描 松散索引扫描,从存储引擎读取分组记录时,会跳着读,读取分组前缀之后,直接通过分组前缀(group by 字段的值)定位到分组中符合 where 条件的第一条或最后一条记录,而不需要读取分组的所有记录...,然后就接着读取下一个分组的分组前缀,这样可以减少 select 语句执行过程中需要读取的记录数,从而比紧凑索引扫描更快(有例外情况,后面会介绍)。...MySQL 把紧凑索引扫描中使用的顺序读取记录嵌入到松散索引扫描的逻辑里,当评估紧凑索引扫描成本比松散索引扫描低时,对于包含 distinct 关键字的聚合函数,就会用顺序读取记录代替跳着读取记录,并且在顺序读取记录的过程中完成记录去重...如果分组中的记录数量多,第二次读取记录时,能跳过的记录就多,节省的成本就多,松散索引扫描就会比紧凑索引扫描更快。

    8.6K60

    MySQL 怎么用索引实现 group by?

    本文我们一起来探寻 MySQL 使用索引实现 group by 的过程,使用临时表实现 group by 会单独用一篇文章来介绍。 本文内容基于 MySQL 5.7.35 源码。...松散索引扫描 松散索引扫描,从存储引擎读取分组记录时,会跳着读,读取分组前缀之后,直接通过分组前缀(group by 字段的值)定位到分组中符合 where 条件的第一条或最后一条记录,而不需要读取分组的所有记录...,然后就接着读取下一个分组的分组前缀,这样可以减少 select 语句执行过程中需要读取的记录数,从而比紧凑索引扫描更快(有例外情况,后面会介绍)。...MySQL 把紧凑索引扫描中使用的顺序读取记录嵌入到松散索引扫描的逻辑里,当评估紧凑索引扫描成本比松散索引扫描低时,对于包含 distinct 关键字的聚合函数,就会用顺序读取记录代替跳着读取记录,并且在顺序读取记录的过程中完成记录去重...如果分组中的记录数量多,第二次读取记录时,能跳过的记录就多,节省的成本就多,松散索引扫描就会比紧凑索引扫描更快。

    6.5K20
    领券