作者:千g来源:blog.csdn.net/n950814abc/article/details/82284838

哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号 加星标置顶 ,在此真诚的表示感谢~正文如下:

最近,在做题库系统,由于在题库中添加了重复的试题,所以需要查询出重复的试题,并且删除掉重复的试题只保留其中1条,以保证考试的时候抽不到重复的题。首先写了一个小的例子:

一、单个字段的操作

这是数据库中的表:


分组介绍


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

查看是否有重复的数据:

  • GROUP BY

  • HAVING

查询出:根据dname分组,同时满足having字句中组条件表达式(重复次数大于1)的那些组count(*)与count(1) 其实没有什么差别,用哪个都可以count(*)与count(列名)的区别:count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)。

1. 查询全部重复的数据


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

2. 删除全部重复试题

将上面的查询select改为delete(这样会出错的)

DELETEFROM deptWHERE dname IN (  SELECT   dname  FROM   dept  GROUP BY   dname  HAVING   count(1) > 1 )

会出现如下错误:[Err] 1093 - You can't specify target table 'dept' for update in FROM clause原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。


3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)

a. 第一种方法


SELECT *FROM deptWHERE dname IN (  SELECT   dname  FROM   dept  GROUP BY   dname  HAVING   COUNT(1) > 1 )AND deptno NOT IN ( SELECT  MIN(deptno) FROM  dept GROUP BY  dname HAVING  COUNT(1) > 1)

上面这种写法正确,但是查询的速度太慢,可以试一下下面这种方法:

b. 第二种方法

根据dname分组,查找出deptno最小的。然后再查找deptno不包含刚才查出来的。这样就查询出了所有的重复数据(除了deptno最小的那行)。

SELECT *FROM deptWHERE deptno NOT IN (  SELECT   dt.minno  FROM   (    SELECT     MIN(deptno) AS minno    FROM     dept    GROUP BY     dname   ) dt )

c. 补充第三种方法

SELECT * FROM table_name AS ta WHERE ta.唯一键 <> ( SELECT max( tb.唯一键 ) FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 );

4. 删除表中多余重复试题并且只留1条

a. 第一种方法:

DELETEFROM deptWHERE dname IN (  SELECT   t.dname  FROM   (    SELECT     dname    FROM     dept    GROUP BY     dname    HAVING     count(1) > 1   ) t )AND deptno NOT IN (SELECT dt.mindeptnoFROM (  SELECT   min(deptno) AS mindeptno  FROM   dept  GROUP BY   dname  HAVING   count(1) > 1 ) dt)

b. 第二种方法(与上面查询的第二种方法对应,只是将select改为delete)

DELETEFROM deptWHERE deptno NOT IN (  SELECT   dt.minno  FROM   (    SELECT     MIN(deptno) AS minno    FROM     dept    GROUP BY     dname   ) dt )

c. 补充第三种方法(评论区推荐的一种方法)

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

二、多个字段的操作

单个字段的如果会了,多个字段也非常简单。就是将group by 的字段增加为你想要的即可。此处只写一个,其他方法请仿照一个字段的写即可。

DELETEFROM deptWHERE (dname, db_source) IN (  SELECT   t.dname,   t.db_source  FROM   (    SELECT     dname,     db_source    FROM     dept    GROUP BY     dname,     db_source    HAVING     count(1) > 1   ) t )AND deptno NOT IN ( SELECT  dt.mindeptno FROM  (   SELECT    min(deptno) AS mindeptno   FROM    dept   GROUP BY    dname,    db_source   HAVING    count(1) > 1  ) dt)

# 总结

其实上面的方法还有很多需要优化的地方,如果数据量太大的话,执行起来很慢,可以考虑加优化一下:

  • 在经常查询的字段上加上索引

  • 将*改为你需要查询出来的字段,不要全部查询出来

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

热门推荐:
  • 大佬带路,用Java实现天天酷跑(附源码),网友:这也太TM屌了~
  • IntelliJ IDEA 更新后,电脑卡成球,该如何优化?
  • 有的年轻人不讲武德,竟然给我公司漂亮的HR小姐姐“下毒”~

sql 删除一条记录_京东笔试题:如何实现 MySQL 删除重复记录并且只保留一条?...相关推荐

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

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

  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数据库删除重复的数据只保留一条

    问题引入 假设一个场景,一张用户表,包含 3 个字段:id,identity_id,name. 现在身份证号 identity_id 和姓名 name 有很多重复的数据,需要删除多余数据只保留一条有效 ...

  5. 删除数据库中的重复数据,只保留一条

    思路: 先查找重复数据 这里定义id相同即为重复 select info from table_name group by id having count(*)>1 只保留一条,可选择id最大/ ...

  6. SQL删除指定条件的重复数据,只保留一条

    DECLARE @Count INT = 1 WHILE @Count > 0 BEGIN DELETE TB FROM TableName TB WHERE TB.ID IN (SELECT ...

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

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

  8. 通过SLQ删除重复的数据,重复的数据只保留1条

    需求: FLowKind表,里有四个字段:Id,KindEngName,Casnumber,Classifications 里面这三个字段KindEngName,Casnumber,Classific ...

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

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

  10. mysql 删除重复数据只保留一条记录

    删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...

最新文章

  1. spring + mybatis
  2. linux关于/etc/profile.d与/etc/profile的正确运用
  3. UVA10689 Yet another Number Sequence【数列+矩阵快速幂】
  4. Linux下PHP5.5编译参数详解
  5. linux .o,.a,.so文件区别是什么
  6. FreeSWITCH之日志级别
  7. 2021-01-09
  8. python编程课程是骗人的吧_在朋友圈买下编程课,你上的是Python还是成功学
  9. CSS3居中的几种方法
  10. python 指定证书验证_使用Python验证SSL证书
  11. 汽油的90#、93#、97#有什么区别的?
  12. SEO人员,做好SEO的三大要素有哪些?
  13. luogu P1373 小a和uim之大逃离
  14. 2004年高考数学压轴题(利用对数齐次化或主元法解决)
  15. 应届生和往届生,谁更容易考研成功?
  16. lynda_如何在尼日利亚以女性开发人员的身份远程工作-与Lynda Chiwetelu的问答
  17. 做程序员必须懂英语吗?_您必须懂英语才能成为程序员吗?
  18. Qt及Qt Quick开发实战精解项目二俄罗斯方块 items方法报错
  19. 筑牢网络安全,联瑞电子为您的信息传输系“安全带”
  20. iOS从健康app中获取步数信息

热门文章

  1. 《挖掘管理价值:企业软件项目管理实战》一1.3 软件项目管理模型
  2. 英特尔第四代酷睿处理器数字和字母代表什么意思
  3. 关于Android项目隐藏标题栏的方法总结
  4. Semantic-UI的React实现(一):架构介绍
  5. ECMAScript6 新特性——“数组的扩展”
  6. Oracle EBS-SQL (PO-10):检查过期采购未接收订单.sql
  7. JSP与Servlet的区别与联系,JSP与JavaScript的区别
  8. js实现正方体旋转动画
  9. 指数函数在c语言中怎么输入,指数函数如果想得到整型的值怎样做?
  10. ORM的个人简单理解以及持久化和持久层的简单理解、Hibernate的简单理解,mybatis 的好处通俗易懂