精华内容
下载资源
问答
  • 主要介绍了MySQL中删除重复数据的简单方法,比起一般的NOT IN语句的效率更为高,需要的朋友可以参考下
  • 执行这个语句后,我们可以看到现在的结果里显示的就是表中重复数据的字段。 要删除这些重复的数据,我们找出这些数据的ID,在select语句里,添加id字段,使用max函数,可以得到重复数据最后面的id。 执行结果如图...
  • 傻了,MySQL 这样写,不行,让人郁闷。 难倒只能分步操作,蛋疼 以下是网友写的,同样是坑爹的代码,我机器上运行不了。 1. 查询需要删除的记录,会保留一条记录。 select a.id,a.subject,a.RECEIVER from test1 a ...
  • 主要介绍了MySQL 处理重复数据的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • MySQL中删除重复数据只保留一条

    万次阅读 2018-09-20 18:14:45
    用SQL语句,删除重复项只保留一条 在几千条记录里,存在着些...1、查找表多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT * FROM people WHERE peopleId IN ( SELECT peopleId FROM ...

    用SQL语句,删除掉重复项只保留一条

    在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 
    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

    SELECT
        *
    FROM
        people
    WHERE
        peopleId IN (
            SELECT
                peopleId
            FROM
                people
            GROUP BY
                peopleId
            HAVING
                count(peopleId) > 1
        )

    2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

    DELETE
    FROM
        people
    WHERE
        peopleName IN (
            SELECT
                peopleName
            FROM
                people
            GROUP BY
                peopleName
            HAVING
                count(peopleName) > 1
        )
    AND peopleId NOT IN (
        SELECT
            min(peopleId)
        FROM
            people
        GROUP BY
            peopleName
        HAVING
            count(peopleName) > 1
    )

    3、查找表中多余的重复记录(多个字段)

    SELECT
        *
    FROM
        vitae a
    WHERE
        (a.peopleId, a.seq) IN (
            SELECT
                peopleId,
                seq
            FROM
                vitae
            GROUP BY
                peopleId,
                seq
            HAVING
                count(*) > 1
        )

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    DELETE
    FROM
        vitae a
    WHERE
        (a.peopleId, a.seq) IN (
            SELECT
                peopleId,
                seq
            FROM
                vitae
            GROUP BY
                peopleId,
                seq
            HAVING
                count(*) > 1
        )
    AND rowid NOT IN (
        SELECT
            min(rowid)
        FROM
            vitae
        GROUP BY
            peopleId,
            seq
        HAVING
            count(*) > 1
    )

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

    SELECT
        *
    FROM
        vitae a
    WHERE
        (a.peopleId, a.seq) IN (
            SELECT
                peopleId,
                seq
            FROM
                vitae
            GROUP BY
                peopleId,
                seq
            HAVING
                count(*) > 1
        )
    AND rowid NOT IN (
        SELECT
            min(rowid)
        FROM
            vitae
        GROUP BY
            peopleId,
            seq
        HAVING
            count(*) > 1
    )

    6.消除一个字段的左边的第一位:

    
    
    UPDATE tableName
    SET [ Title ]= RIGHT ([ Title ],(len([ Title ]) - 1))
    WHERE
        Title LIKE '村%'
    
    

    7.消除一个字段的右边的第一位:

    
    
    UPDATE tableName
    SET [ Title ]= LEFT ([ Title ],(len([ Title ]) - 1))
    WHERE
        Title LIKE '%村'
    
    

    8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录

    UPDATE vitae
    SET ispass =- 1
    WHERE
        peopleId IN (
            SELECT
                peopleId
            FROM
                vitae
            GROUP BY
                peopleId

    可能会遇到You can't specify target table '表名' for update in FROM clause这样的错误,它的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中),即不能依据某字段值做判断再来更新某字段的值。

     

    1、数据准备

    product表数据如下:

     

    laptop表数据如下:

     

    2、要求:#删除所有不生产打印机厂商生产的笔记本电脑

    第一步:对aptop表进行操作

    操作没有问题,按照本思路对product表进行操作

    产生You can't specify target table '表名' for update in FROM clause错误

     

     

    3、问题解决

    将SELECT出的结果再通过中间表SELECT一遍,这样就规避了错误。

     

    需要注意的是,这个问题只出现于MySQL,MSSQL和Oracle不会出现此问题。

    展开全文
  • fromname from emailitem where mailfolder = 'INBOX' order by mailUid desc 但查询出的数据还是重复的,问题到底出在哪呢,google后发现上图的sql语句里的distinct是当 fromaddress,fromname都不重复的时候才会...

    最近利用郭神的litepal建立了邮件客户端的前端数据库,然后实现最近联系人的显示,需要在数据库里去查询发送人的昵称和发送人的地址两个字段,但发现litepal不支持distinct查询,但可以通过原生的sql语句实现:

    select distinct fromaddress,fromname from emailitem where mailfolder = 'INBOX' order by mailUid desc 

    但查询出的数据还是重复的,问题到底出在哪呢,google后发现上图的sql语句里的distinct是当 fromaddress,fromname都不重复的时候才会过滤掉,那么distinct可以指定这两个属性的某一个吗,答案是不可以的,所以我们就需要用到group by这个关键字,将数据进行分组来起到过滤的效果

    select  fromaddress,fromname from emailitem where mailfolder = 'INBOX' group by fromaddress order by mailUid desc ")

    这样便可以过滤到重复的元素了。

    参考链接:

    https://blog.csdn.net/weixin_36210698/article/details/73496673

    展开全文
  • 有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 50 1240 Abraham Lincoln High School 70 35 1241 Acalanes High School 120 89...
  • 今天小编就为大家分享一篇关于shell脚本操作mysql数据库删除重复数据,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • MySQL中经常会遇到重复数据,那么当我们遇到重复的时候的时候,如果定位哪些数据是有重复的记录?如何删除重复数据?我们该怎么做呢?接下来我们一步步来分析一下遇到这样的情况后,该如何处理。 初始化实验环境...

    微信搜索“coder-home”或扫一扫下面的二维码,关注公众号,第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我
    在这里插入图片描述



    MySQL中经常会遇到重复的数据,那么当我们遇到重复的时候的时候,如果定位哪些数据是有重复的记录?如何删除重复的数据?我们该怎么做呢?接下来我们一步步来分析一下遇到这样的情况后,该如何处理。

    初始化实验环境

    我们创建一个简单的表user_info,然后基于这个表进行分析重复数据的处理情况。其中的id为自增主键,namesexage三个列是我们判断是否为重复数据的key,如果这三列的值相同,则认为这行数据为重复数据。

    • 建表语句如下:

      CREATE TABLE `user_info` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `name` varchar(255) DEFAULT NULL,
        `sex` varchar(255) DEFAULT NULL,
        `age` int(11) DEFAULT NULL,
        `remark` varchar(255) DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
      
    • 初始化数据如下:

      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (1, 'A', '男', 22, '第一个A');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (2, 'B', '女', 33, '第一个B');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (3, 'C', '男', 44, '第一个C');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (4, 'D', '女', 55, '第一个D');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (5, 'A', '男', 22, '第二个A');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (6, 'B', '女', 33, '第二个B');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (7, 'C', '男', 44, '第二个C');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (8, 'D', '女', 55, '第二个D');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (9, 'E', '男', 18, '第一个E');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (10, 'A', '男', 22, '第三个A');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (11, 'B', '女', 33, '第三个B');
      INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (12, 'F', '男', 15, '第一个F');
      
    • 最后表中数据如下:

      idnamesexageremark
      1A22第一个A
      2B33第一个B
      3C44第一个C
      4D55第一个D
      5A22第二个A
      6B33第二个B
      7C44第二个C
      8D55第二个D
      9E18第一个E
      10A22第三个A
      11B33第三个B
      12F15第一个F

    明确需求

    假设我们的要求是保留重复数据中,第一次出现的数据,后面出现的数据不保留。

    也就是我们的上面的这个表中每一组重复数据中id最小的一行数据需要保留,其他比较大的id的重复的数据行需要被删除。当然如果是要保留id行最大的一行数据最为最后的数据行也是可以了,只要在查询的时候,稍微修改一下SQL语句的min(id)或max(id)函数即可。

    查找重复的数据

    基于前面我们初始化的实验数据,首选我们要查询出那些数据是有重复数据的行,通过下面的SQL语句,可以得到结果:其中有重复数据的是name值为A、B、C、D的四种类型的数据。

    • 使用如下SQL可以查询出来那些数据行有重复记录,并统计出重新出现的次数。

      select 
      	name, sex, age, count(*) as count
      from user_info 
      group by name, sex, age 
      having count(*) > 1;
      
    • 重复数据在表中的统计结果如下:

      namesexagecount
      A223
      B333
      C442
      D552

    查找要保留的数据

    上面我们知道该如何查询哪些数据是重复数据了,那么我们需要保留的数据是哪些?

    • 使用下面的SQL既可以获取到我们要保留的数据行:

      select * from user_info 
      where id in (
      	select 
      		min(id) 
      	from user_info 
      	group by name, sex, age
      );
      
    • 结果如下:

      idnamesexageremark
      1A22第一个A
      2B33第一个B
      3C44第一个C
      4D55第一个D
      9E18第一个E
      12F15第一个F

    上面的结果就是我们需要最后留下来的数据。这里包含了非重复的时候和每一组重复的数据中id最小的数据行。

    删除重复的数据

    方法一

    这是最笨的一种方式,也是最容易理解的一种方式,效率也比较低。思路如下:

    1. 查询出每一组的重复数据的key值,也就是这里的name,sez,age三个字段。

      1. SQL语句如下:

        select
        		name, sex, age
        from user_info
        group by name, sex, age
        having count(*) > 1
        
      2. 结果如下:

        namesexage
        A22
        B33
        C44
        D55
    2. 查询出每一组重复数据中,最小的id值。

      1. SQL如下:

        select 
        	min(id)
        from user_info 
        group by name, sex, age
        having count(*) > 1;
        
      2. 结果如下:

        min(id)
        1
        2
        3
        4
    3. 把上面的两个查询的结果,作为条件来筛选出每组重复数据中除id最小的行之外的重复数据行,这些行就是需要被删除的行。

      1. SQL语句如下:

        select * from user_info 
        where (name,sex,age) in ( 
        	select -- 查询重复数据中,name, sex, age的值
        		name, sex, age
        	from user_info
        	group by name, sex, age
        	having count(*) > 1
        )
        and id not in ( 
        	select -- 查询重复数据中,最小的id值
        		min(id)
        	from user_info 
        	group by name, sex, age
        	having count(*) > 1
        );
        
        
      2. 结果如下:

        idnamesexageremark
        5A22第二个A
        6B33第二个B
        7C44第二个C
        8D55第二个D
        10A22第三个A
        11B33第三个B

    从上面的过程中,我们一步一步定位到了我们需要删除的数据是哪些。定位到这些数据之后,删除的时候,只要把查询语句改为删除语句即可。所以最后通过这样的方式来删除我时候,我们的删除语句如下:

    delete from user_info 
    where (name,sex,age) in ( 
    	select x.* from ( -- 删除的时候,这里要在包裹一层子查询
    		select -- 查询重复数据中,name, sex, age的值
    			name, sex, age
    		from user_info
    		group by name, sex, age
    		having count(*) > 1
    	) as x
    )
    and id not in (
    	select min_id from ( -- 删除的时候,这里要在包裹一层子查询
    		select -- 查询重复数据中,最小的id值
    			min(id) as min_id
    		from user_info 
    		group by name, sex, age
    		having count(*) > 1
    	) as y
    );
    

    注意:上面的删除语句中,我们在两个where条件中的子查询语句外面又包裹了一层子查询,即为上面SQL语句中的as x和as y两个查询语句,之所以包裹一层的原因是在程序如下的错误提示:

    1093 - You can't specify target table 'user_info' for update in FROM clause, Time: 0.084000s
    

    上述错误的原因是:修改一个表的时候子查询不能是这被修改的这个表,所以,我们的解决办法是,在子查询外面再套一层查询语句就可以了。

    方法二

    上面方法一的思路是想办法找到我们要删除的数据是哪些,然后我们在删除的时候,使用where条件去匹配这些查询出来要删除的数据行,以此来达到删除重复数据的目的。

    此时,我们不防换一个角度思考:我们不要去关注哪些是我们需要删除的重复数据,相反,我们去关注哪些是我们需要留下来的数据。然后我们可以在删除的时候,使用取反的方式not in我们需要保留下来的数据,那不是就我们需要删除的数据吗?

    所以,我们想一想哪些使我们需要留下来的数据呢?每一组数据中,id值最小的哪一行就是我们要保留的数据行。其余的我们就不关心了。那么怎么样才能取到这样的数据行呢?

    • 使用下面的SQL语句可以获取我们需要保留的数据行的所有的id的值:

      select 
      	min(id) 
      from user_info 
      group by name, sex, age;
      
    • 结果如下:

      min(id)
      1
      2
      3
      4
      9
      12

    既然我们想要保留的数据行的id集合得到了,在我们要删除数据的where条件中,使用not in我们要保留的id集合,不就是需要删除的数据吗?

    • 删除重复数据的语句如下:

      delete from user_info 
      where id not in(
      	select min_id from (
      		select 
      			min(id) as min_id
      		from user_info 
      		group by name, sex, age
      	) as x
      );
      

    注意:这里为了避免MySQL的1903错误,我们也在where条件的子查询中包裹了另外一个子查询,即上面SQL中as x查询语句。

    方法三

    通过两个表关联的方式来删除数据,这个方式效率比较高,推荐使用这种方式。自己和自己关联,关联的条件就是我们判断数据是否为重复数据的key。除此之外,最重要的一个条件是:两个表的id关联条件,这个是删除保留数据的关键条件。

    • 查询重复数据的SQL语句如下:

      select a.*,b.* 
      from user_info as a 
      inner join user_info as b 
      on a.name = b.name 
      and a.sex = b.sex 
      and a.age = b.age
      and  a.id > b.id;
      
    • 结果如下:

      idnamesexageremarkid(1)name(1)sex(1)age(1)remark(1)
      5A22第二个A1A22第一个A
      6B33第二个B2B33第一个B
      7C44第二个C3C44第一个C
      8D55第二个D4D55第一个D
      10A22第三个A1A22第一个A
      10A22第三个A5A22第二个A
      11B33第三个B2B33第一个B
      11B33第三个B6B33第二个B
    写法1

    删除重复数据SQL语句如下:

    delete a.*
    from user_info as a 
    inner join user_info as b 
    on a.name = b.name 
    and a.sex = b.sex 
    and a.age = b.age
    and  a.id > b.id;
    
    写法2

    除了上面的那种写法之外,还有另外一种写法,如下:

    查询待删除的重复数据SQL如下:

    select * from user_info as a 
    where a.id <> (
    	select 
    		min(b.id) 
    	from user_info as b 
    	where a.name = b.name
    	and a.sex = b.sex
    	and a.age = b.age
    );
    

    删除重复数据的SQL语句如下:

    delete a.* from user_info as a
    where a.id <> (
    	select
    		min(b.id)
    	from (
    		select * from user_info
    	) as b
    	where a.`name`= b.`name`
    	and a.sex = b.sex
    	and a.age = b.age
    );
    

    总结

    以上是对于MySQL中重复数据删除的时候,经常使用的方法。希望能帮助到你。

    最后提醒一点: 在真正删除之前,记得对原数据备份一下。以便删除错误后,数据不能恢复回来。可以使用如下的语句来创建一个备份表,以便于在删除错误后,把数据恢复到原来的表中取。

    create table user_info_bak as select * from user_info; --创建一个备份表
    truncate table user_info; -- 清空原始表中的数据
    insert into user_info select * from user_info_bak; -- 从备份表中把数据插入到原始表中
    

    像上面这样操作,数据如果删除失误的时候,可以从user_info_bak中还原数据到user_info表中。


    微信搜索“coder-home”或扫一扫下面的二维码,关注公众号,第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我
    在这里插入图片描述


    展开全文
  • MySQL 去除重复数据实例详解 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均都重复,二是部分字段重复的记录。对于第一种重复,比较容易解决,只需在查询语句使用distinct关键字去重,几乎所有...
  • 采用的是下面的方法可删除,假设重复的是test数据库的title字段 代码如下:create table bak as (select * from test group by title having count(*)=1); insert into bak (select * from test...
  • 主要为大家详细介绍了MySQL处理重复数据的实现代码,如何防止数据表出现重复数据及如何删除数据表重复数据,感兴趣的小伙伴们可以参考一下
  • MySQL数据库查询重复数据 select * from employee group by emp_name having count (*)>1; Mysql 查询可以删除重复数据 select t1.* from employee t1 where (t1.emp_name) in (select t4.emp_name from ...
  • 查重是我们在工作经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于MySQL查询重复数据删除重复数据保留id最小的一条为唯一数据)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...
  • MySQL数据库中删除重复记录的方法总结[推荐]
  • Mysql删除重复数据

    2020-06-08 15:40:53
    数据表: mysql> select * from students; +---------+-----+--------+ | name | age | stu_id | +---------+-----+--------+ | lisi | 19 | 1 | | aaa | 10 | 2 | | bbb | 10 | 3 | | ccc | 19 | 4 | | ddd | 19...

    准备

    数据表:

    mysql> select * from students;
    +---------+-----+--------+
    | name    | age | stu_id |
    +---------+-----+--------+
    | lisi    |  19 |      1 |
    | aaa     |  10 |      2 |
    | bbb     |  10 |      3 |
    | ccc     |  19 |      4 |
    | ddd     |  19 |      5 |
    | eee     |  20 |      6 |
    | fff     |  20 |      7 |
    | zhansan |  11 |     11 |
    | laowang |  10 |     12 |
    | wangwu  |  20 |     13 |
    +---------+-----+--------+
    10 rows in set (0.00 sec)
    
    

    需求:

    删除年龄重复的数据,并保留学号(stu_id)最大的一条。

    方法一

    1. 查询出重复的组中每组最大的ID
    mysql> SELECT age, MAX(stu_id) as max_id from students GROUP BY age HAVING count(*) > 1;
    +-----+--------+
    | age | max_id |
    +-----+--------+
    |  10 |     12 |
    |  19 |      5 |
    |  20 |     13 |
    +-----+--------+
    3 rows in set (0.00 sec)
    
    
    1. 查询出需要删除的记录的ID
    mysql> select t1.* from students t1, (SELECT age, MAX(stu_id) as max_id from students GROUP BY age HAVING count(*) > 1) as t2 WHERE t1.age=t2.age and t1.stu_id<t2.max_id;
    +------+-----+--------+
    | name | age | stu_id |
    +------+-----+--------+
    | lisi |  19 |      1 |
    | aaa  |  10 |      2 |
    | bbb  |  10 |      3 |
    | ccc  |  19 |      4 |
    | eee  |  20 |      6 |
    | fff  |  20 |      7 |
    +------+-----+--------+
    6 rows in set (0.00 sec)
    
    1. 删除记录
    DELETE t1 from students as t1, (SELECT age, MAX(stu_id) as max_id from students GROUP BY age HAVING count(*) > 1) as t2 WHERE t1.age=t2.age and t1.stu_id < t2.max_id
    

    方法二

    1. 查询每组ID最大的记录
    mysql> select max(stu_id) as max_id from students GROUP BY age;
    +--------+
    | max_id |
    +--------+
    |     12 |
    |     11 |
    |      5 |
    |     13 |
    +--------+
    4 rows in set (0.00 sec)
    
    1. 删除ID不是max_id的记录
    DELETE from students WHERE stu_id not in (SELECT f.max_id from (select max(stu_id) as max_id from students GROUP BY age) f)
    
    展开全文
  • 本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
  • 再用python进行数据爬取的时候,把需要的字段值存入MySQL数据库,却出现了重复数据,在解决这一问题的时候遇到的坑。在此记录一下,备忘。 数据资源:链接:https://pan.baidu.com/s/14VUd5ftpUXrAz-Ka5UXk4w 提取...
  • 主要介绍了Mysql删除重复数据保留最小的id 的解决方法,需要的朋友可以参考下
  • MYSQL 删除重复数据

    万次阅读 2018-08-23 15:30:43
    test表name字段信息有重复,想进行过滤删除重复数据 删除重复数据之后的预期结果(不考虑id):   方法一: 用 create ......select......group by ...... 先创建临时表tab,新表tab的数据时从test表分组...
  • mysql数据库删除重复数据保留一条

    万次阅读 多人点赞 2019-07-09 22:15:13
    现在身份证号identity_id和姓名name有很多重复数据,需要删除只保留一条有效数据。 2.模拟环境 1.等入mysql数据库,创建一个单独的测试数据库mysql_exercise create database mysql_exercise charset utf8; 2....
  • Mysql去除重复数据

    万次阅读 2018-09-17 17:12:10
    最近工作业务上遇到需要去除重复数据,所以了解了一下如何去除某属性相同的数据! 1:查询出重复数据 以用户表user为例,我们需要去除login_name重复的数据,那么我们首先需要查询一下哪些数据是重复的。 sql如下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,880
精华内容 74,352
关键字:

mysql中删除重复数据

mysql 订阅