题解 | 检索并列出已订购产品的清单 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

主要目的

单纯去重

分组 + 聚合计算

能否计算

不能直接计算每组的总和/平均

可以 (SUM, COUNT, AVG...)

性能

通常稍快(只需排序/哈希去重)

稍慢(需构建分组桶并计算)

语义

"我要唯一的行"

"我要按某列分类统计"

总结

  • 想去重:用 SELECT DISTINCT ...
  • 想统计不重复数量:用 COUNT(DISTINCT col)
  • 记住:它是针对所有选中列的组合进行去重。
  • 避坑:大数据量慎用;不要试图用它解决“取每组最新一条”的复杂需求。
牛客网题目 文章被收录于专栏

做题心得,记录下来,供自己学习

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务