在写 SQL 查询时,经常会遇到一个问题:结果里有重复的数据。 这时候,很多人会问:怎么才能只保留唯一的结果?
答案就是 —— DISTINCT。
这篇文章带你全面理解 DISTINCT 的正确用法。
1. 为什么需要去重?
假设我们有一张用户订单表 orders:
id | user_id | product
---|---------|---------
1 | 101 | iPhone
2 | 102 | iPad
3 | 101 | MacBook
4 | 103 | iPhone
5 | 101 | iPhone
如果我们想看看 有哪些用户买过东西,直接查询:
SELECT user_id FROM orders;
结果是:
user_id
-------
101
102
101
103
101
这里 101 出现了三次,因为他买过多件商品。 👉 但我们只想要用户 ID 的 唯一集合。
2. 使用 DISTINCT 去重
这时可以用 DISTINCT:
SELECT DISTINCT user_id FROM orders;
结果:
user_id
-------
101
102
103
很干净,重复的 101 被去掉了。
3. 多列去重
DISTINCT 不仅能对单列去重,还能对多列组合去重。
比如,我们想知道 用户和商品的唯一组合:
SELECT DISTINCT user_id, product FROM orders;
结果:
user_id | product
--------|---------
101 | iPhone
101 | MacBook
102 | iPad
103 | iPhone
👉 注意:101 + iPhone 只会出现一次,即使他买过多次。
4. DISTINCT 和 COUNT 一起用
很多时候,我们不是要查数据本身,而是要 统计唯一值的数量。
SELECT COUNT(DISTINCT user_id) AS unique_users FROM orders;
结果:
unique_users
------------
3
说明这张表里,一共有 3 个不同的用户。
5. 使用 DISTINCT 的注意事项
- 效率问题
DISTINCT 会对结果集做排序或哈希去重,如果表很大,查询可能比较慢。
如果只是想去重统计,建议结合 索引 优化。
- 不要滥用
有些重复其实是数据问题,比如订单表里有脏数据。
如果经常要 DISTINCT,要考虑是不是数据库设计出了问题。
6. 总结
DISTINCT 用来去掉查询结果中的重复行;
可以作用于 单列 或 多列组合;
常和 COUNT 搭配,统计唯一值数量;
在大表中要注意性能,必要时结合索引优化。
一句话记住: DISTINCT 是快速去重的利器,但也要分清场景,避免滥用。 🚀
💡 建议:在练习 SQL 时,可以自己建一张简单的 orders 表,多试试 DISTINCT 和 COUNT(DISTINCT ...),加深理解。