数据库常用操作之删除重复数据且仅保留一条

  • 单字段操作
    • 查询全部重复的数据
      • MySQL实现
      • Oracle实现
    • 查询表中重复数据(id最小除外)
      • MySQL实现
    • 删除表中多余重复数据并且只留1条
      • MySQL实现
      • Oracle实现
  • 多字段操作
    • 删除表中多余重复数据并且只留1条
  • 其他
  • 参考链接

单字段操作

查询全部重复的数据

MySQL实现

  • sql脚本

    Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)

Oracle实现

查询表中重复数据(id最小除外)

MySQL实现

  • sql脚本

    -- 方式一SELECT *FROM表WHERE主键 NOT IN (SELECTt.主键别名FROM(SELECTMIN(主键) AS 主键别名FROM表GROUP BY重复字段) t)-- 方式二SELECT * FROM 表 AS ta WHERE ta.唯一键 <> ( SELECT min( tb.唯一键 ) FROM 表 AS tb WHERE ta.判断重复的列 = tb.判断重复的列 );-- 方式三(使用exists 替代 in)SELECT *FROM表 t1WHERENOT EXISTS (SELECT1FROM(SELECTMIN(主键) AS 主键别名FROM表GROUP BY重复字段) t2WHERE t2.主键别名 = t1.主键)
  • 执行结果分析

    方式二查询的数据会比方式一少一些,因为重复的列可能存在为空的情况,导致关联失败,无法查询,mysql可以使用ifnull()函数将对应重复字段替换成指定字符,如0,Oracle使用nvl()函数。

    SELECT * FROM 表 AS ta WHERE ta.唯一键 <> ( SELECT min( tb.唯一键 ) FROM 表 AS tb WHERE ifnull(ta.判断重复的列,'0') = ifnull(tb.判断重复的列,'0') );

    在判断null==null时结果为false;故查询数据为空。Oracle中在处理千万数据之下时,可以使用内部函数nvl(null,‘0’)赋相同值判断两个空值。如果是千万以上数据建议使用isnull判断。目的是消除nvl对索引的影响。

删除表中多余重复数据并且只留1条

MySQL实现

  • 方式一

    delete from 表 where 主键 not in (select min(主键) as 主键别名 from 表 group by 重复字段);
  • 注意事项

    方式一执行会出现如下错误:[Err] 1093 - You can’t specify target table ‘dept’ for update in FROM clause

    原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作

    解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新

  • 方式二(推荐使用)

    delete from 表 where 主键 not in (select 表别名.主键别名 from (select min(主键) as 主键别名 from 表 group by 重复字段) 表别名) ;-- 删除username相同的重复数据,保留id最小的用户信息delete from student whereusername in (select username from ( select username from student group by username having count(username)>1) a)and id not in ( select id from (select min(id) as id from student group by username having count(username)>1 ) b)-- 简写delete from student where id not in (select id from (select min(id) as id from student group by username) b);
  • 方式三

    DELETE FROMtable_name AS ta WHEREta.唯一键 <> (SELECTt.maxid FROM( SELECT max( tb.唯一键 ) AS maxid FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 ) t );
    

Oracle实现

多字段操作

删除表中多余重复数据并且只留1条

  • 方式一

    DELETEFROMdeptWHERE(dname, db_source) IN (SELECTt.dname,t.db_sourceFROM(SELECTdname,db_sourceFROMdeptGROUP BYdname,db_sourceHAVINGcount(1) > 1) t)AND deptno NOT IN (SELECTdt.mindeptnoFROM(SELECTmin(deptno) AS mindeptnoFROMdeptGROUP BYdname,db_sourceHAVINGcount(1) > 1) dt)

其他

  • count(*)与count(1)与count(列名)异同

    count(*)与count(1)其实没有什么差别,用哪个都可以

    count(*)与count(列名)的区别

    count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)

  • in 和 exists关键字

    小表驱动大表用IN,大表驱动小表用EXISTS。IN适合的情况是外表数据量小的情况,而不是外表数据大的情况,因为IN会遍历外表的全部数据,假设a表100条,b表10000条那么遍历次数就是100*10000次,而exists则是执行100次去判断a表中的数据是否在b表中存在,它只执行了a.length次数。至于哪一个效率高是要看情况的,因为in是在内存中比较的,而exists则是进行数据库查询操作的

参考链接

  • mysql删除重复记录并且只保留一条

    https://blog.csdn.net/n950814abc/article/details/82284838

  • SQL IN与EXISTS的执行效率比较

    https://www.cnblogs.com/AllUserBegin/p/3513084.html

  • sql优化–in和exists效率

    https://www.cnblogs.com/weifeng123/p/9530758.html

数据库常用操作之删除重复数据且仅保留一条相关推荐

  1. 【删除重复数据,仅保留一条-mysql】

    删除重复数据,仅保留一条 DELETE FROM table WHERE id NOT IN ( SELECT t.id FROM ( SELECT MIN( id ) AS id FROM stud ...

  2. mysql删除重复数据只保留一条_mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  3. php去除重复的数据保留一条,mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  4. mysql查找删除重复数据并只保留一条

    mysql表中,某一字段的值有很多重复数据,需要将这些重复的数据记录删除,只保留其中的一条数据即可,如何使用SQL语句来实现呢,本文章向大家介绍mysql如何查找删除重复数据,需要的朋友可以参考一下. ...

  5. 用SQL语句删除数据库重复数据,只保留一条有效数据

    在实际开发中,可能会遇到数据库多条数据重复了,此时我们需要删除重复数据,只保留一条有效数据,用SQL语句怎么实现呢,下面我们模拟一下: 1.准备重复数据: 2.过滤出存在重复数据的信息: SQL语句: ...

  6. mysql删除重复记录并且只保留一条

    准备的测试表结构及数据 插入的数据中A,B,E存在重复数据,C没有重复记录 CREATE TABLE `tab` (   `id` int(11) NOT NULL AUTO_INCREMENT,   ...

  7. 最简单的删除重复记录(只保留一条)的SQL方法

    首先,新建一张表用于示例说明: # 新建一张表A create table A( id varchar(5), name varchar(5), salary float);# 插入数据(包含要去除的 ...

  8. SQL Server 删除重复记录,只保留一条记录

    原文地址:http://blog.csdn.net/eriato/article/details/17417303 有张表格之前没有设计关键字段的唯一约束,导致有时候执行插入操作时不小心执行了多次就出 ...

  9. SQL删除重复的记录(只保留一条)

    首先新建表: --创建示例表 CREATE TABLE t (id INT IDENTITY(1,1) PRIMARY KEY,a VARCHAR(10),b VARCHAR(10) ) --插入数据 ...

最新文章

  1. SQL存储过程实现分页查询
  2. 微软职位内部推荐-Senior Software Engineer_Azure
  3. 深度学习100例 | 第27天-卷积神经网络(CNN):艺术作品识别
  4. STM32,CAN总线过滤器的设置详细讲解
  5. ios 拍照 实现 连拍_如何在iOS设备上使用连拍模式拍照
  6. 货物与产品的区别_超市货架和仓储式货架有什么区别?
  7. CSDN登陆校验码模式识别程序
  8. angularjs--resource
  9. linux中mysql不显示中文_linux中解决mysql中文乱码方法
  10. CISCO路由器的备份与还原(2)
  11. 自制操作系统:引导扇区的实现
  12. 软件测试缺陷报告分析,测试报告中的缺陷分析和测试结论应该怎么写?
  13. 蚁群算法原理及python代码实现
  14. 卡诺模型案例分析_通过KANO模型来协调优先级排序(附实例)
  15. antd表格分页设置
  16. 不可不读的百句良言!!
  17. 几行代码,让黑白老照片重获新生!
  18. oracle 企业管理器网页打不开 解决https://localhost:1158/em问题
  19. POJ1659 Frogs' Neighborhood(Havel定理)
  20. 电脑上有哪些好用的视频剪辑软件

热门文章

  1. FireStart教程:基于SharePoint的出差报销流程七
  2. 关闭Windows自带的IIS服务
  3. 【软件设计师07】程序设计语言与语言处理程序基础
  4. 《JavaScript忍者秘籍》(第二版)- 第5章 -精通函数:闭包和作用域
  5. Windows 下的命令行方案cmder+babun
  6. 背包问题(01背包问题,多重背包问题,完全背包问题)——基于python的动态规划
  7. 【java笔记】有序集合SortedSet和有序映射SortedMap的使用
  8. 华为29岁程序员,工作4年,无房无车无妹,一身病!以为钱好赚,是年轻人最大的错觉...
  9. Python 函数定义与调用
  10. php获取qq群列表,开源POST获取QQ群列表和成员