方法一:使用 DISTINCT 去重
(注:distinct adj.不同的; 清楚的,明显的; 确切的)
DISTINCT 是最简单的方式,用于查询特定列中唯一的值。
使用方法:select distinct 重复列名字段 form 表名; (分号结尾,表示语句的结束)
示例:name表中有一列user_name包含重复数据,可以使用以下查询:
select distinct user_name from name;
方法二:使用 GROUP BY 去重
GROUP BY 根据指定列对数据分组,每组只保留一条记录。
使用方法:
select 重复列名字段 form 表名
group by 重复列名字段;
示例:name表中有一列user_name包含重复数据,可以使用以下查询:
select user_name from name
group by user_name;
区别:distinct和group by区别
- DISTINCT:单纯去重,只保留唯一值,不做任何计算
- GROUP BY:分组 + 聚合计算,必须配合聚合函数使用(sum/count/avg/max/min)
| 特性 | DISTINCT | GROUP BY |
|---|---|---|
| 主要用途 | 去除重复行 | 按字段分组,做统计计算 |
| 必须配合聚合函数 | ❌ 不需要 | ✅ 必须(count/sum/avg 等) |
| 结果集 | 唯一值列表 | 分组 + 每组统计结果 |
| 性能 | 简单去重更快 | 分组统计更慢(但功能更强) |
| 能否排序 | 不能主动排序 | 会隐式排序(MySQL) |
| 适用场景 | 查看有哪些值 | 统计每个组有多少、总和、平均值 |
(1)distinct 核心规则
1)必须放在查询列名字段最前面,不能放中间 / 后面
-- 正确
SELECT DISTINCT user_name, age FROM name;
-- 错误
SELECT user_name, DISTINCT age FROM user;
2)distinct 对后面所有的字段均起作用,即 去重是查询的所有字段完全重复的数据,而不是只对 distinct 后面连接的单个字段重复的数据。
3)无法只对单个字段生效。若你查多列,想只按某一列去重,distinct 做不到。
(2)group by规则
一般与聚类函数使用(如count()/sum()/avg/max/min等),也可单独使用(效果 = 按全部字段整体去重)。
--代码:
SELECT
city,
COUNT(*) AS 人数,
AVG(salary) AS 平均工资
FROM user
GROUP BY city;
/*运行结果:
北京 2 7500
上海 1 9000
*/
group by 也对后面连接的所有字段均起作用,即 去重是查询的所有字段完全重复的数据,而不是只对 group by后面连接的单个字段重复的数据
查询的字段与group by 后面分组的字段没有限制。(在oracle中使用group by时,查询的字段必须是group by 分组的字段和聚类函数。如select name,sex from tb_students group by name这个sql)
最关键的 3 条差异(必背)
-
位置不同distinct 必须放最前面;group by 放语句最后。
-
去重范围一样,但目的不同
- distinct:单纯去重
- group by:分组 + 可统计
-
单字段去重能力不同
- distinct:查多列 → 无法只按单列去重
- group by:可以做到按单列去重并显示其他字段

6152

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



