mysql中distinct语句如何去重

说白了,MySQL的DISTINCT就是帮你把结果集里重复的行给筛掉,但它的门道比看起来要复杂点。

先说最重要的,DISTINCT是整体判断重复,不是单列判断。
比如去年我们跑那个电商项目,有次用SELECT DISTINCT customer_id FROM orders结果不对,后来发现是因为订单表里有客户ID相同但订单金额不同的记录,DISTINCT根本不管金额,只看customer_id,所以完全重复的行才被筛掉。
另外一点要注意NULL值处理,MySQL把NULL当做一个特殊值,两个NULL就算不同,这个点很多人没注意。
还有个细节挺关键的,比如数据量大概3 000万的时候,执行SELECT DISTINCT name, city FROM users会特别慢,因为MySQL得先组合name和city生成“指纹”,再判断重复,这会搞出临时表和全表扫描。
我一开始也以为建索引能解决,后来发现不对,复合索引只有在name和city完全固定顺序的情况下才高效。

结尾提醒:当你看到需要对大量数据去重时,先想想能不能用GROUP BY替代,特别是带统计函数的时候,性能差很多。

mysql中DISTINCT的用法

说实话,我当年刚接触MySQL时,对DISTINCT的理解也挺混乱的。
比如有一次我写了个查询,想统计不同城市的客户数量,直接用了SELECT COUNT(city) FROM customers,结果返回的是每个城市客户数的总和,完全不是我想的那个唯一城市数量。
后来才发现得用COUNT(DISTINCT city)才行。

有意思的是,DISTINCT对NULL值挺有意思的。
我遇到过个场景,表里有大量空着用户省份的记录,如果用SELECT DISTINCT province FROM users,那些NULL值会自动算作一个独立值,不会重复计数。
这个特性有时候挺救急,但也得注意,比如统计有NULL的列时,可能结果比预期少。

排序这块儿也容易踩坑。
我之前写个查询想按城市名排序,结果发现SELECT DISTINCT city ORDER BY city FROM customers返回的顺序乱七八糟。
后来查了手册才知道,因为DISTINCT先去重再排序,所以得写成SELECT DISTINCT city FROM customers ORDER BY city这样,先去重再按city排序才对。

性能这块儿说实话有点劝退。
我有个客户的数据表有上百万条记录,他让我用DISTINCT去查某个字段的唯一值,结果查询时间直接炸了。
后来我们改用临时表或者索引优化才解决。
所以现在我对用DISTINCT前,都会先想想数据量到底多大,小表无所谓,大表最好还是找找其他办法。

跟聚合函数一起用的时候,我常用它来统计不同类型的记录数。
比如SELECT COUNT(DISTINCT status) FROM orders能快速知道有多少种不同的订单状态。
这个用法比单纯用DISTINCT列名直观多了,至少能直接看到数量。

最后说个冷知识,DISTINCT其实是作用于整个结果集的。
我有个朋友非说SELECT DISTINCT(name, age) FROM users会先去重name,再去重age,实际上MySQL是看做(name, age)这个组合的唯一性,只有完全一样的行才会被去掉。
这点得反复琢磨。

这块儿我没亲自跑过窗口函数的DISTINCT,数据我记得是X左右,但建议你核实下官方文档,现在MySQL对复杂查询优化得越来越好了。

如何在mysql中使用DISTINCT去重

嘿,兄弟,你问的这个DISTINCT去重,我真是用过不少次了。
记得有一次,我帮一个朋友的公司做数据清洗,他们有个用户表,里面城市那一栏重复的太多,得,我就用了个DISTINCT,直接在city那字段前加上去,结果一下就出来了所有不重复的城市名称,那叫一个爽。

有一次,我还用DISTINCT去处理多列的情况,就是name和city这两个字段。
有个场景是,比如一个名字叫张三的,不管他住在哪个城市,只要城市不一样,我就得把两条记录都保留。
这就得用到多列组合去重,挺实用的。

还有一次,我用DISTINCT结合COUNT函数,统计一下不同城市的人数。
这个操作,我告诉你,真是帮了大忙了,一下子就看到了哪个城市用户最多。

但是,兄弟,这DISTINCT也不是随便用的,它对性能有点影响。
比如我之前在一个大数据量的表上用DISTINCT,那系统得排序或者哈希处理,挺费劲的。
所以,我建议啊,只在必要的时候用,而且相关字段最好有索引,这样能快一点。

至于NULL值,这玩意儿也会被DISTINCT处理,比如一个字段里好几个NULL,DISTINCT会把它当做一个记录。
所以,用的时候得注意一下。

总之,DISTINCT是个好工具,用好了能提高效率,但是也得注意性能和细节。
哈哈,就这些经验,希望能帮到你。