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`
根据手机号分组:
SELECT id,user_name,msg,phone FROM `send_message` GROUP BY phone ;
数据重复量少时用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
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》