sql语句去重

我给你举个具体的例子,你就明白了。

2 02 2 年,我在北京这家公司做项目的时候,遇到个SQL问题。

当时我们有个表叫orders,里面记录了好多订单信息。
表里有customer_id、product_id、order_date这些字段。

我需要查每个客户只买过一次的产品,怎么写?
我就用了SELECT DISTINCT customer_id, product_id FROM orders GROUP BY customer_id, product_id HAVING COUNT() = 1
结果返回了2 000条记录,不多不少。

如果我想知道有多少个客户只买过一次产品,又该怎么写?
就变成SELECT COUNT(DISTINCT customer_id) FROM orders GROUP BY customer_id HAVING COUNT() = 1
这次返回了5 00条,代表有5 00个客户只买过一次产品。

我当时也懵,为什么用DISTINCT和用GROUP BY效果不一样...
后来才反应过来,DISTINCT是针对每一行都去重,而GROUP BY是先分组再去重。
这个区别特别重要。

可能我偏激,但你要记住:DISTINCT不是万能的。
2 02 2 年那个项目,如果数据量再大点,直接用DISTINCT就会卡死。

我们最后改用临时表解决了。
先分组统计,再关联查询。
虽然麻烦,但效率高。

记住这个例子,北京那家公司,2 000条记录,5 00个客户...

distinct在sql语句里面的用法,大家来看看

这就是坑,DISTINCT可能导致查询慢,特别是大数据集。

实操提醒:只在必要时使用DISTINCT,考虑使用索引优化性能。