MySQL去重详解(3种主流去重方式)

MySQL去重详解(3种主流去重方式)-mikechen

MySQL去重是大家经常在MySQL开发中经常使用到的,下面我重点详解MySQL去重的3种方式。

distinct去重

distinct语法如下:

SELECT DISTINCT column_name,column_name FROM table_name;

distinct支持单列、多列的去重方式。

单列示例:

select distinct task_id from Task

上面就是列出 task_id 的所有唯一值。

备注:distinct 只能放在查询字段的最前面,不能放在查询字段的中间或者后面。

distinct 通常效率较低,一般与 count 配合用来计算条数。

select count(distinct task_id) task_num from Task

 

group by去重

group by去重一般与聚类函数使用(如count()/sum())等使用,也可单独使用。

group by语法如下:

SELECT column_name,column_name FROM table_name 
WHERE column_name operator value 
GROUP BY column_name

group by是按指定的列分组,一般这时在select中会用到聚合函数,比如:常常和max()一起用,当然你要用count之类的也是可以的。

示例:

原数据

SELECT id,user_name,msg,phone FROM `send_message`

MySQL去重详解(3种主流去重方式)-mikechen

根据手机号分组:

SELECT id,user_name,msg,phone FROM `send_message` GROUP BY phone ;

MySQL去重详解(3种主流去重方式)-mikechen

数据重复量少时用distinct效率高,数据重复量多时建议使用group by,效率高。

 

row_number

最后我们来说说 row_number() 函数,从 MySQL 8.0 开始才支持此函数。

row_number语法格式:

row_number() over (partition by <用于分组的字段名> order by <用于组内排序的字段名>)

需求:找出 users 表中重复的 last_name 和 email,并将这一行记录删掉。

示例如下:

DELETE FROM users
WHERE id IN (
    SELECT id
    FROM (
        SELECT 
            id, ROW_NUMBER () Over (PARTITION BY last_name,email ORDER BY id) as r 
        from users
    ) t
    WHERE r > 1
);
select * from users;

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法