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

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

在MySQL数据库操作中,数据去重是常见的需求。当我们需要从查询结果中排除重复记录时,通常会面临两个选择:使用DISTINCT关键字或GROUP BY子句。...col1, col2; 在大多数情况下,两者的执行计划非常相似,特别是当MySQL优化器识别到GROUP BY用于去重而非聚合时。...GROUP BY有时更高效 SELECT col1, col2 FROM test_table GROUP BY col1, col2; -- 可能使用索引 SELECT DISTINCT col1,...-- 计算不同部门的数量 SELECT COUNT(DISTINCT department_id) FROM employees; 子查询中的去重 -- 在子查询中使用DISTINCT SELECT...HAVING子句过滤分组结果 -- 找出员工数量超过10人的部门 SELECT department, COUNT(*) as emp_count FROM employees GROUP BY department

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

    「干货」Hive常用10大应用技巧『Hive系列2』

    01 Hive运行顺序 在应用Hive过程中,你是否有过这样的疑问? 「同层查询中,sum/avg聚合后的过滤是否可以放在where后面?」...针对类似问题,只要清楚了Hive SQL的运行顺序,便会迎刃而解,顺序如下: (步骤7) SELECT count(*) as col1 (步骤8) DISTINCT (步骤1) FROM (步骤3)...正确写法 A join B on A.key=B.key ; 错误写法 from A ,B where A.key=B.key ; 下面写法在mysql/oracle等价于内连接,但是在Hive中会导致笛卡尔积...07 distinct与group by的区别「计数场景」 在去重计数场景中,我们经常应用count(distinct)来进行处理;有时也会先在内层通过group by聚合,然后再在外层计数count(...原理:distinct需要将col列中的全部内容都存储在一个内存中,可以理解为一个hash结构,key为col的值,最后计算hash结构中有多少个key即可得到结果。

    2K10

    MySQL DQL 数据查询

    SELECT * FROM tbl LIMIT 95,18446744073709551615; 注意,MySQL目前不支持使用 -1 表示返回从偏移量开始剩余的所有记录,即下面的写法是错误的: SELECT...MySQL 规定,当非聚合函数中的列不存在于 GROUP BY 子句中,则选择每个分组的第一行。 (3)COUNT DISTINCT 统计符合条件的记录数量。...如果像对符合条件的记录进行 COUNT DISTINCT,那么如何添加条件呢? 参见 MySQL distinct count if conditions unique,可以使用下面的方法。...COUNT(DISTINCT CASE WHERE 条件 THEN 字段 END) 参见 mysql count if distinct,也可以使用下面这种方法。...COUNT(DISTINCT col_name1, IF(col_name2=1, true, null)) 10.UNION 子句 UNION 的作用是将两次或多次查询结果纵向合并起来。

    1.7K20

    MySQL数据库对象与应用-MySQL进阶SQL应用单元测验

    错误的是: A.select * from song order by play_count asc; B.select * from song order by (play_count + fav_count...2、(单选)以下关于distinct的描述,正确的是: A.distinct的作用是分组 B.distinct的查询结果一定是从小到大排序的 C.distinct可以和函数结合使用,如count(distinct...col) D.sql语句里使用了distinct,就不能使用group by或者order by 解析:  A、分组是group by,distinct是列出唯一的不同值 3、(多选)有表 song...count(*)>2 ; 这个sql错误的地方是: A.order by 后面跟group by语句 B.album没有出现在select语句中 C.在having条件中使用了count(*) D.这个...10、(多选)能被select * from tbl where col like '%b%e%' 查询出来的条件有: A.ecbd B.abcde C.eedbe D.cdde

    1.9K10

    MySQL联合索引:深度解析与最佳实践指南

    索引跳跃扫描(Index Skip Scan) MySQL 8.0.13+新特性: 在某些条件下,即使查询条件不包含最左列,优化器也能使用联合索引: -- MySQL 8.0.13+ 可能使用索引 SELECT...IN (distinct_values) AND col2 = 'value' AND col3 = 'value'; 限制条件: 索引第一列的distinct值较少 查询需要覆盖索引或回表成本较低...前缀索引与选择性优化 选择性计算公式: 列选择性 = COUNT(DISTINCT column) / COUNT(*) 索引选择性 = COUNT(DISTINCT (col1, col2, ...)...计算不同前缀长度的选择性 SELECT COUNT(DISTINCT LEFT(column, 10)) / COUNT(*) as selectivity_10, COUNT(DISTINCT...LEFT(column, 20)) / COUNT(*) as selectivity_20, COUNT(DISTINCT LEFT(column, 30)) / COUNT(*) as selectivity

    40110

    必备神技能 | MySQL 查找删除重复行

    错误的查询语句 如果把两列放在一起分组,你会得到不同的结果,具体看如何分组和计算大小。提问者恰恰是困在了这里。有时候查询语句找到一些重复行却漏了其他的。...(distinct c > 1); 结果返回所有的行,因为CONT(*)总是1.为什么?...这个错误很容易被忽略,事实上等效于 select b, c, count(*) from a_b_c   group by b, c   having count(1)     or count(1);...你要的是 select b, c, count(*) from a_b_c   group by b, c   having count(distinct b) > 1     or count(distinct...而且最令人沮丧的是,对于某些情况,这种语句是有效的,如果错误地以为就是这么写法,然而对于另外的情况,很可能得到错误结果。 事实上,单纯用GROUP BY 是不可行的。为什么?

    3.7K00

    PawSQL更新 | 新增9个SQL正确性审核规则

    避免COUNT DISTINCT多个可空列 规则描述 当你使用COUNT(DISTINCT) 进行多列的计算时,它的计算结果可能和你预想的不同。...COUNT(DISTINCT col) 计算该列除 NULL 之外的不重复行数,而COUNT(DISTINCT col, col2)则会排除掉任何一列为NULL的行。...譬如对于如下的查询,对列a和列组合(a,b)的统计不同值的个数, select count(distinct t.a) a_cnt, count(distinct t.a,t.b) a_b_cnt from...默认预警级别 提示 触发条件 SQL中存在COUNT DISTINCT函数 COUNT的参数包括二个或两个以上的表达式 参数至少有一个是可以为空的 3....同表同字段比较 规则描述 同表同字段进行比较一般可以重写为更为简洁的表达式,一般都是由于错误导致的不合理的SQL语句。

    47510

    MySQL最常用分组聚合函数

    常用的组函数: AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 统计行的数量 MAX([distinct] expr) 求最大值 MIN([distinct...4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]...默认情况下,UNION = UNION DISTINCT   ①进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致;   ②默认会去掉两个查询结果集中的重复行;默认结果集不排序...;   ③最终结果集的列名来自于第一个查询的SELECT列表 UNION ALL不去掉结果集中重复的行 注:联合查询结果使用第一个select语句中的字段名 mysql> select * from

    6K20

    MySQL最常用分组聚合函数

    常用的组函数: AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 统计行的数量 MAX([distinct] expr) 求最大值 MIN([distinct...4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]...默认情况下,UNION = UNION DISTINCT   ①进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致;   ②默认会去掉两个查询结果集中的重复行;默认结果集不排序...;   ③最终结果集的列名来自于第一个查询的SELECT列表 UNION ALL不去掉结果集中重复的行 注:联合查询结果使用第一个select语句中的字段名 mysql> select * from

    5.9K10

    MYSQL 优化

    查询优化主要需要考虑的问题如下: 加速SELECT ... WHERE查询,首先需要考虑的是是否需要添加索引。通过将 WHERE语句中的查询条件添加为索引来加速查询评估,过滤和结果检索。...单MyISAM及MEMORY 表COUNT(*) 操作是直接从表信息中获取的。. 及早发现不合理的常量表达式,MySQL能够很快发现SELECT语句的可查性,并不返回行数据。...当DISTINCT结合LIMIT row_count 时,MySQL会在查找到在足够的记录数时就会立马停止查询。 当使用的列包含在所有表中,当在一个表中找到记录时,就会终止读取其它的表。...如下 SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a; LIMIT Query 优化 LIMIT用户查询特定数量的结果集: 可以使用索引时,会索引优先。...LIMIT row_count 结合 DISTINCT 时,找到即停止。 一些情况下,GROUP BY 可以通过索引计算获得结果。

    3K40

    必备神技能 | MySQL 查找删除重复行

    错误的查询语句 如果把两列放在一起分组,你会得到不同的结果,具体看如何分组和计算大小。提问者恰恰是困在了这里。有时候查询语句找到一些重复行却漏了其他的。...(distinct c > 1); 结果返回所有的行,因为CONT(*)总是1.为什么?...这个错误很容易被忽略,事实上等效于 select b, c, count(*) from a_b_c group by b, c having count(1) or count(1)...你要的是 select b, c, count(*) from a_b_c group by b, c having count(distinct b) > 1 or count(distinct...而且最令人沮丧的是,对于某些情况,这种语句是有效的,如果错误地以为就是这么写法,然而对于另外的情况,很可能得到错误结果。 事实上,单纯用GROUP BY 是不可行的。为什么?

    5.1K90

    MySQL的count()函数及其优化

    (*) 作用 都是检索表中所有记录行的数目,不论其是否包含null值 区别 count(1)比count(*)效率高 二 . count(字段)与count(1)和count(*)的区别 count(字段...FROM tablename WHERE COL = ‘value’ 这种 杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现...用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL...> select name, count(name), count(1), count(*), count(age), count(distinct(age)) -> from counttest...(name) | count(1) | count(*) | count(age) | count(distinct(age)) | +------+-------------+----------+-

    1.4K10
    领券