题解 | 检索并列出已订购产品的清单 distinct
检索并列出已订购产品的清单
https://www.nowcoder.com/practice/9e4741b77f4244149a069883bc0d23be
select distinct prod_id from OrderItems;
DISTINCT 是 SQL 中用于去除重复行的关键字。它的作用是确保查询结果集中,每一行数据都是唯一的。
1. 核心语法
SELECT DISTINCT 列名1, 列名2, ... FROM 表名;
- 位置:必须紧跟在
SELECT关键字之后。 - 作用范围:作用于后面所有选中的列。只有当这些列的组合值完全相同时,才会被视为重复并被去除。
2. 工作原理图解
假设有一张表 logs:
1 | Alice | iPhone |
2 | Alice | iPhone |
3 | Alice | Android |
4 | Bob | iPhone |
场景 A:单列去重
SELECT DISTINCT user FROM logs;
- 逻辑:只看
user列。 - 结果:AliceBob(Alice 出现了3次,去重后只留1个)
场景 B:多列组合去重(重点!)
SELECT DISTINCT user, device FROM logs;
- 逻辑:看
(user, device)的组合。(Alice, iPhone) 出现了2次 -> 去重留1个。(Alice, Android) 出现了1次 -> 保留。(Bob, iPhone) 出现了1次 -> 保留。 - 结果:AliceiPhoneAliceAndroidBobiPhone
⚠️ 注意:
DISTINCT不是针对某一列单独去重,而是针对整行选中列的组合去重。你不能写SELECT user, DISTINCT device,这是语法错误的。
统计有多少个不同的用户(这是 DISTINCT 最常用的场景之一,配合聚合函数使用)
-- 统计不重复的用户数 SELECT COUNT(DISTINCT user_id) AS unique_users FROM orders;
DISTINCT vs GROUP BY
主要目的 | 单纯去重 | 分组 + 聚合计算 |
能否计算 | 不能直接计算每组的总和/平均 | 可以 ( |
性能 | 通常稍快(只需排序/哈希去重) | 稍慢(需构建分组桶并计算) |
语义 | "我要唯一的行" | "我要按某列分类统计" |
总结
- 想去重:用
SELECT DISTINCT ...。 - 想统计不重复数量:用
COUNT(DISTINCT col)。 - 记住:它是针对所有选中列的组合进行去重。
- 避坑:大数据量慎用;不要试图用它解决“取每组最新一条”的复杂需求。
牛客网题目 文章被收录于专栏
做题心得,记录下来,供自己学习

查看7道真题和解析