关于MySQL中的重复行

  • 1、重复行的定义
  • 2、单字段重复
    • 2.1、查询重复记录
    • 2.2、删除多余行
  • 3、多字段重复
    • 3.1、查询重复记录
    • 3.2、删除多余行
  • 4、小结

1、重复行的定义

在不同的业务场景中,可能我们对重复行的定义不一样,比如以下的表记录:

在某些场景下,我们把name字段重复的记录称为重复行,而在另一些场景下,我们把name和address都重复的记录称为重复行,或者把name,sex,birth,address这4个字段都重复的记录称为重复行,具体可区分为两大类:单字段重复和多字段重复,无论是哪一种,我们的目的都是将重复的记录找出来,然后删除掉多余的,只保留一行,这是我们的最终目的。

2、单字段重复

这种某一个字段重复的情况很简单,我们只需要将这个字段用group by进行分组,然后用count聚合函数和having子句进行过滤就行了。

2.1、查询重复记录

还是以这张表为例:

现在我认为name重复的记录就是重复记录,先找出重复记录,SQL语句:

SELECT*
FROM
USER
WHERENAME IN ( SELECT NAME FROM USER GROUP BY NAME HAVING count(*) > 1 );

查询结果:

结果是没问题的,OK,找出重复记录后的下一步是删除多余记录,只保留其中一条。

2.2、删除多余行

因为删除是按主键Id来进行删除的,修改上面的SQL语句:

SELECTmin( id )
FROM
USER
WHERENAME IN ( SELECT NAME FROM USER GROUP BY NAME HAVING count(*) > 1 )
GROUP BY
NAME;

查询结果:

可以考虑用min(id)来进行筛选,保留重复记录最小id对应的记录,其余重复的删掉。

SELECTmin( id )
FROM
USER
GROUP BY
NAME;


刚好重复的几条记录的id都不在结果集中,那么最终的删除语句为:

DELETE
FROM
USER
WHEREid NOT IN ( SELECT tmp.mid FROM ( SELECT min( id ) mid FROM USER GROUP BY NAME ) tmp );

执行完毕后的表记录:

name字段重复的记录只保留下了id最小的一条,其余重复的删掉了。

3、多字段重复

先补充一下表记录:

3.1、查询重复记录

现在我认为name,sex和address都相同的记录才是重复的,那么先查询出来:

SELECT*
FROM
USER
WHERE( NAME, sex, address ) IN (SELECT NAME,sex,address FROMUSER GROUP BYNAME,sex,address HAVINGcount(*) > 1 );

查询结果:

结果没问题。

3.2、删除多余行

还是使用min(id)来筛选,先查询:

SELECTmin( id )
FROM
USER
GROUP BYNAME,sex,address


然后删除,最终语句:

DELETE
FROM
USER
WHEREid NOT IN ( SELECT tmp.mid FROM ( SELECT min( id ) mid FROM USER GROUP BY NAME, sex, address ) tmp );

执行后的表记录:

可以看到,name、sex、address都相同的重复记录只保留了一条,其余多的删掉了。

4、小结

重复记录的定义不同,可根据具体业务场景来进行筛选删除,无论是单字段还是多字段重复,大体思路都一样,借助min(id)或max(id)来辅助筛选删除。

MySQL中查询和删除重复行相关推荐

  1. MySQL中查询、删除重复记录的方法大全

    查找所有重复标题的记录: select title,count(*) as count from user_table group by title having count>1; SELECT ...

  2. mysql删除重复文章标题_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: 一.查找重复记录 1.查找全部重复记录 2.过滤重复记录( ...

  3. mysql删除重复的判断_MySQL中查询、删除重复记录一共有多少种方法?

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...

  4. mysql去掉两个最高分_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...

  5. MySQL 如何查找并删除重复行

    如何查找重复行 第一步是定义什么样的行才是重复行.多数情况下很简单:它们某一列具有相同的值.本文采用这一定义,或许你对"重复"的定义比这复杂,你需要对sql做些修改.本文要用到的数 ...

  6. MySQL的查询及删除重复记录

    查询及删除重复记录的方法 (一) 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (sele ...

  7. Mysql中查找并删除重复数据的方法

    (一)单个字段 1.查找表中多余的重复记录,根据(question_title)字段来判断 代码如下 复制代码 select * from questions where question_title ...

  8. 温故知新MySQL--如何在MySQL表中删除重复行

    2019独角兽企业重金招聘Python工程师标准>>> 如何在MySQL表中删除重复行 在实际应用中,会有需要删除重复数据的场景.这里简单介绍下如何删除重复的数据 1. 准备数据 C ...

  9. mysql group by 去除重复_mysql中distinct和group by过滤删除重复行

    下面先来看看例子: 代码如下 table id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. 比如我想用一条语句查询得到name不重复的 ...

最新文章

  1. Linuxnbsp;rpmnbsp;命令参数使用…
  2. sql 中的导航函数 FIRST_VALUE, LAST_VALUE
  3. 如何编写高性能的C#代码(二)
  4. Spring IOC 和 AOP 概览
  5. Java正成为COBOL的一部分-它将成为COBOL的一部分吗?
  6. PWN-PRACTICE-BUUCTF-25
  7. 5G(3)---5G NR协议栈及功能2 - MAC RLC PDCP SDAP
  8. oc总结 --oc基础语法相关知识
  9. 学习嵌入式和单片机有没有必要,价值体现在哪
  10. 大型企业网络构建之网关冗余
  11. Linux下ffmpeg批量转换图片
  12. 服务器代码review要点
  13. 纸黄金投资之道――积小胜为大胜(就是别贪)
  14. 《一件小事.呐喊》--鲁迅 词语解释
  15. 分布式系统下的幂等性问题如何解决?
  16. 2022年全球市场旋转压片机总体规模、主要生产商、主要地区、产品和应用细分研究报告
  17. 微信支付服务器system error,微信企业支付--遇到不明确结果的err_code:SYSTEMERROR,NOT_FOUND...
  18. niit考试题库计算机英语翻译,NIIT SM2-MT1模拟试题 HELP KEY
  19. JAVA消息(第一篇)JMS 很重要!!!!包教包会!!不闹!!!下一篇-AMQP(wire-level protocol)
  20. Cadence IC 617 虚拟机安装使用说明

热门文章

  1. 全行业聚合支付平台接口_各类API聚合支付平台
  2. 计算机网络浅知识[ 3 ]:IP世界的基本构成
  3. Haskell函数式编程学习笔记
  4. 导出excel时,数字过长怎么解决
  5. UML的九种图+包图
  6. 白话完全解析动态规划原理及相关问题(二)
  7. 2021世界燕窝展|上海滋补品展谈燕窝可以提高人体的免疫力?
  8. 泰课在线 秘密行动课程
  9. 高薪就业面试题系列 人事篇三
  10. springboot Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory