首页 > 数据库 >MySQL重复数据

MySQL重复数据

时间:2023-04-06 16:12:17浏览次数:46  
标签:name 重复 -- user tab MySQL 数据 id SELECT

插入的数据中A,B,E存在重复数据,C没有重复记录

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE TABLE `tab` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(20) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;    -- ---------------------------- -- Records of tab -- ---------------------------- INSERT INTO `tab` VALUES ('1', 'A'); INSERT INTO `tab` VALUES ('2', 'A'); INSERT INTO `tab` VALUES ('3', 'A'); INSERT INTO `tab` VALUES ('4', 'B'); INSERT INTO `tab` VALUES ('5', 'B'); INSERT INTO `tab` VALUES ('6', 'C'); INSERT INTO `tab` VALUES ('7', 'B'); INSERT INTO `tab` VALUES ('8', 'B'); INSERT INTO `tab` VALUES ('9', 'B'); INSERT INTO `tab` VALUES ('10', 'E'); INSERT INTO `tab` VALUES ('11', 'E'); INSERT INTO `tab` VALUES ('12', 'E');

使用HAVING关键字筛选出表中重复数据

1 SELECT `name`,COUNT(1) FROM TAB GROUP BY `name` HAVING COUNT(1) >1

可以通过分组语句从每种重复数据中都拿出一条标识

1 SELECT `name`,id  FROM TAB GROUP BY `nameHAVING COUNT(1) >1

删除重复记录并且只保留一条 [留意SQL注释] 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 DELETE from tab where -- 删除所有的重复时间 Begin -- `name` in (     SELECT * from (SELECT `name`FROM TAB GROUP BY `nameHAVING COUNT(1) >1) tmp2 ) -- 删除所有的重复时间 END -- -- 但一些特定ID的记录不进行删除  Begin -- AND id NOT in(     select id from (         SELECT `name`,id  FROM TAB GROUP BY `name` HAVING COUNT(1) >1     ) tmp1 ) -- 但一些特定ID的记录不进行删除  END --

执行后最终结果

方法二

MySql如何删除所有多余的重复数据

方法一查询出的所有多余的重复记录:

方法二查询出的所有多余的重复记录(与方法一的结果相同):

方法三查询出的所有多余的重复记录:这里方法三因为用了MAX()方法(也可改用MIN()),查询结果记录的id不太一样,但也可以被视为重复多余的数据,关键是你希望选择保留哪一条记录而已。

MySql如何删除所有多余的重复数据 需要处理的数据,如:

在这里插入图片描述

出现重复的数据,如:

在这里插入图片描述

先用SELECT查询看看结果:

1 2 3 4 5 6 7 -- 方法一 SELECT * FROM t_user WHERE user_name IN (     SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1 ) AND id NOT IN (     SELECT MIN(id) FROM t_user GROUP BY user_name HAVING COUNT(1)>1 )

方法一查询出的所有多余的重复记录:

在这里插入图片描述

1 2 3 4 -- 方法二 SELECT * FROM t_user WHERE id NOT IN (     SELECT MIN(id) FROM t_user GROUP BY user_name )

方法二查询出的所有多余的重复记录(与方法一的结果相同):

在这里插入图片描述

1 2 3 4 -- 方法三 SELECT * FROM t_user AS t1 WHERE t1.id <> (     SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name )

方法三查询出的所有多余的重复记录:

在这里插入图片描述

这里方法三因为用了MAX()方法(也可改用MIN()),查询结果记录的id不太一样,但也可以被视为重复多余的数据,关键是你希望选择保留哪一条记录而已。

下面是对上面的SELECT语句稍作修改并加入了DELETE

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 -- 方法一(笨方法但容易理解) DELETE FROM t_user WHERE user_name IN (     SELECT t1.user_name FROM (         -- 查询出所有重复的user_name         SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1     ) t1 ) AND id NOT IN (     SELECT t2.min_id FROM (         -- 查询出所有重复的记录并各自只取其中一条(MIN(id)或MAX(id)都可以)         SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name HAVING COUNT(1)>1     ) t2 ) -- 方法二(推荐方法也容易理解) DELETE FROM t_user WHERE id NOT IN (     SELECT t.min_id FROM (         -- 过滤出重复多余的数据,比如,如果所有记录中存在1条记录是user_name=zhangsan的,那么就取出它;         -- 如果所有记录中存在多条记录是user_name=lisi的,那么只取其中1条,其他的不查询出来         SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name   ) t ) -- 方法三(推荐方法但不太容易理解) DELETE FROM t_user WHERE id IN (     SELECT t.id FROM (         -- 1. 关于所有存在相同user_name的记录,只查询出(保留)重复记录中的1条,假设这样查询出来的集合为A集合。         -- 2. 在所有记录中,只要id不在A集合中的,都把它们查询出来         SELECT t1.id FROM t_user AS t1 WHERE t1.id <> (SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name)     ) t ) -- 或 DELETE FROM t_user t1 WHERE t1.id <> (     SELECT t2.max_id FROM (         SELECT MAX(t3.id) AS max_id FROM t_user t3 WHERE t1.user_name=t3.user_name     ) t2 )
 

最后删除成功之后,显示数据已经没有重复的了

标签:name,重复,--,user,tab,MySQL,数据,id,SELECT
From: https://www.cnblogs.com/howhy/p/17293094.html

相关文章

  • 电商产品评论数据情感分析
    #-*-coding:utf-8-*-#代码12-1评论去重的代码importpandasaspdimportreimportjieba.possegaspsgimportnumpyasnp#去重,去除完全重复的数据reviews=pd.read_csv("D:/school/three/below/12/data/reviews.csv")reviews=reviews[['content',&#......
  • 深入理解MySQL索引底层数据结构
    1引言在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQ......
  • flask:蓝图(blueprint)、g对象、数据库连接池
    目录一、蓝图(blueprint)1、蓝图介绍2、蓝图的使用3、使用蓝图,划分小型项目目录4、使用蓝图,划分大型项目目录5、其他知识点二、g对象三、数据库连接池一、蓝图(blueprint)1、蓝图介绍在Flask中,使用蓝图Blueprint来分模块组织管理。蓝图实际可以理解为是一个存储一组视图方法的容器......
  • HTTP JSON接口模拟工具interfake的使用(模拟接口返回json数据)
    场景在与第三方系统进行模拟对接时,需要本地根据接口文档的示例json数据快速模拟出来接口进行调试用。Interfake官方github地址:https://github.com/basicallydan/interfakeInterfake能简便地创建虚假的HTTPAPI,只需简单几行代码就可以创建模拟JSON接口(使用命令行方式也可以......
  • Java虚拟机运行时数据区(JVM_2)
    2.3运行时数据区(Run-TImeDataAreas)2.3.1官网概括官网;https://docs.oracle.com/javase/specs/jvms/se8/html/index.htmlTheJavaVirtualMachinedefinesvariousrun-timedataareasthatareusedduringexecutionofaprogram.Someofthesedataareasarecreate......
  • 你被大数据“杀熟”了么?
    前两天,有星球球友问我一个问题,说:他在某电商平台看上了iPadPro,准备买,其实已经有优惠了,但是一想到双十一了,于是就想着等双十一再买,肯定更优惠,然而到了双十一当天,他懵了,256g双十一价格反而涨了50,64g的涨了200。他百思不得其解,问我难道双十一都是套路么?......
  • PageOffice既保存Word文件中指定区域的数据又保存整篇文件
    一、首先在word文件中给需要在后台获取数据的区域设置以PO_开头的书签。二、通过pageoffice在线打开文件并编辑保存。有两种打开文件的模式1、普通编辑模式(docNormalEdit)普通编辑模式就是简单的打开文件,分别设置SaveDataPage保存数据的方法和SaveFilePage保存文件的方法即可,......
  • 如何创造数据资产价值?如何对内赋能业务运营,对外创造市场价值?
    在数据资产化初见成效后,接下来企业就需要落实数据共享和配套的数据分析工具,让更多业务部门或组织可以使用这些数据资源或数据资产。那么如何利用这些数据资产对内赋能业务运营、对外创造市场价值?本篇将介绍数据共享与分析、数据产品对内的业务运营和对外的价值创造。  — ......
  • STATA 日期型数据显示格式调整
    useceshi1,clear.list//+--------------------+//|A3_1A3_2A3_3|//|--------------------|//1.|196752|//2.|1945822|//3.|1949314|//4.|1986616|//5.|195......
  • js中通过数据库查询省,后自动带出市显示的问题
    //注册地址varprovince=SQL("selectprovincefromprojectwherecode='"+code+"'andisdelete=0orderbyindatelimit1");$("#field_2c923daf70a540290170aa8ad7a102ff").val(province);varcity=SQL("selectcityfrom......