SQL去除重复项:distinct和group by使用及区别

方法一:使用 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)
特性DISTINCTGROUP 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 条差异(必背)

  1. 位置不同distinct 必须放最前面;group by 放语句最后。

  2. 去重范围一样,但目的不同

    • distinct:单纯去重
    • group by:分组 + 可统计
  3. 单字段去重能力不同

    • distinct:查多列 → 无法只按单列去重
    • group by:可以做到按单列去重并显示其他字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值