在 SQL 中,去重用于从查询结果中移除重复的记录,确保返回的数据唯一,核心通过DISTINCT关键字实现,适用于需要获取不重复值的场景(如统计 unique 用户数、提取所有分类名称等)。
一、基本去重:DISTINCT 关键字
1. 单字段去重
对单个字段去重,返回该字段所有不重复的值,语法:
SELECT DISTINCT 字段名 FROM 表名;
示例:从orders表中提取所有不重复的用户 ID(查看有哪些用户下过单):
SELECT DISTINCT user_id FROM orders;
2. 多字段去重
对多个字段组合去重,只有当所有字段的值完全相同时才视为重复记录,语法:
SELECT DISTINCT 字段1, 字段2, ... FROM 表名;
示例:从users表中提取不重复的 “城市 + 性别” 组合(统计不同城市的性别分布类别):
SELECT DISTINCT city, gender FROM users;
说明:此例中,只有当 “城市” 和 “性别” 都相同时才会被去重,若仅城市相同而性别不同,会被视为不同的记录保留。
二、去重与聚合:结合 COUNT() 统计
DISTINCT 常与聚合函数 COUNT() 结合,统计不重复记录的数量,语法:
SELECT COUNT(DISTINCT 字段名) AS 去重后数量 FROM 表名;
示例 1:统计orders表中不重复的用户数(即有多少个独立用户下过单):
SELECT COUNT(DISTINCT user_id) AS unique_user_count FROM orders;
示例 2:统计不重复的 “城市 + 性别” 组合数量:
SELECT COUNT(DISTINCT city, gender) AS unique_group_count FROM users;
三、注意事项
-
DISTINCT作用范围:DISTINCT对其后所有字段生效,而非仅对紧跟的第一个字段生效。例如SELECT DISTINCT a, b是对a和b的组合去重,而非仅对a去重。 -
与
GROUP BY的关系:多字段去重也可通过GROUP BY实现(GROUP BY会自动对分组字段去重),效果与DISTINCT相同,但DISTINCT更简洁。例如:-- 与 SELECT DISTINCT city, gender FROM users 效果一致 SELECT city, gender FROM users GROUP BY city, gender; -
NULL 值的处理:
DISTINCT会将所有 NULL 视为相同值,去重后只保留一条 NULL 记录。例如字段email中有多个 NULL,SELECT DISTINCT email只会返回一个 NULL。 -
性能影响:去重操作需要对数据进行排序或哈希处理,对大表查询可能影响性能,建议仅在必要时使用,并确保相关字段有合适的索引。
四、适用场景
- 提取唯一值列表(如所有商品分类、所有省份名称);
- 统计独立实体数量(如独立访客数、独立下单用户数);
- 清洗重复数据(结合
WHERE条件筛选后去重)。
DISTINCT 是标准 SQL 中最直接的去重方式,通过单字段或多字段组合,能高效实现数据去重需求,是数据查询和统计分析中的常用操作。
7万+

被折叠的 条评论
为什么被折叠?



