大家好,欢迎踏入野生程序猿的生存之道,我是你们的老朋友大猿猿!

今天聊聊数据库里怎样删除重复数据。

“重复”的定义

首先咱先明确一下什么叫重复数据,比如你有个表,好比说学生表吧,这个表里出现了两条一模一样的数据,姓名、性别、出生日期、学号、等等等等,全都一样,那么这两条数据就叫重复数据。当然,重复的也不一定是两条,可能一个学生出现了20条,这20条都是重复的,或者张三出现了3条,李四出现了4条等等。

有主键

无主键

重复数据又可分为两种情况,第一种是这个表连主键都没有,所有字段全重复。第二种是这个表有主键,除了主键外的其他字段重复。

我们的目标

说到这里大家应该了解了,本文里的重复数据其实算是一种垃圾数据,它本不该出现,但由于各种原因,比如你导数据时重复操作了,比如你保存按钮没做控制而又发生了连击现象,等等等等。

那么出现了重复数据,我们期望怎么办呢?当然是把多余的删掉,只保留一条

解决办法--有主键

我们先捋捋思路,假设某个重复数据有n条,那么我们要删掉n-1条,留下1条,而留下的这个“1”,其实和其他数据没有任何区别,那么我们怎么定位出这个“1”呢?怎么让这个“1”和其他数据有所不同呢?说到这里,应该有同学想到了,主键肯定不一样!没错,我们就可以用主键区分,一不做二不休,我们就留主键最大的那个!直接上SQL:

delete from student T1 where id <> (select max(id) from student T2 where T1.name = T2.name and T1.age = T2.age and T1.gender = T2.gender and T1.national = T2.national and T1.addr = T2.addr)

为了保险起见,我们先把delete改成select *,看看要删的内容是不是和我们预想的一样:

可以看到,确实查出来的是重复的,且ID不是相同数据中最大的。我们执行delete,然后再看表中数据:

可以看到,重复数据已经被删除了。注意,例子中,张三只有3条重复,另外一个张三只是恰好重名而已,其他信息不同。

解决办法--无主键

方案一:

对于无主键的情况思路也是完全一样,但是这里出现问题了,没有ID怎么办?大家不妨这样想,虽然两行数据一模一样,但是数据库自己却能区分出谁是谁,那么数据库中肯定还有其他标识以供区分!比如oracle,就会有个隐藏字段rowid。(如果你用的那个数据库他偏偏就是没有这么个标识,那就只能先给这个表加一列,然后给这列赋值成一个自增序列)

我们先把这个字段查出来看看它的真容:

select T.rowid,T.* from student T

虽然我们不知道rowid里到底存的是啥意思,但可以肯定的一点是,它不会和别的行重复,于是我们刚才的那个sql只需改成这样就行了:

delete from student T1 where rowid <> (select max(rowid) from student T2 where T1.name = T2.name and T1.age = T2.age and T1.gender = T2.gender and T1.national = T2.national and T1.addr = T2.addr)

方案二:

还有另一种方案,稍微笨一点。大家查询时去除重复都知道怎么写吧?没错:

select distinct * from student

看结果:

那么我们只需基于这个查询新建个表,然后再把原来的表干掉,最后再给新建的表改改名就OK啦:

create table student_temp as select distinct * from dy.student;drop table student;alter table student_temp rename to student;

为什么说这个方案稍微笨一点呢?因为你建完表后,还要注意原表有没有索引、权限、触发器等一系列相关的东西,如果有,你还得重新把这些东西建上。

好了小伙伴们,你学会了吗?点我头像能学习更多实用的开发小技巧,别忘了点关注哦~

sql left join 去重_混入了一些奇怪的东西?SQL小技巧之数据去重相关推荐

  1. sql left join用法_一张图看懂 SQL 的各种 join 用法!

    作者:C.L. Moffatt www.codeproject.com/Articles/33052 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN ...

  2. sql server复制表_具有超过246列的表SQL Server复制

    sql server复制表 问题 (Problem) In our environment we use SQL Server merge replication to replicate data ...

  3. sql server父节点_将新节点添加到现有SQL Server Always On可用性组中

    sql server父节点 This is the 5th article in the series of a comprehensive guide to SQL Server Always On ...

  4. sql索引调优_使用内置索引利用率指标SQL Server索引性能调优

    sql索引调优 描述 (Description) Indexing is key to efficient query execution. Knowing what indexes are unne ...

  5. 加sql查询语句导出_搞不懂这些查询语句,SQL简单查询也无法从入门到熟练

    大纲: 一.基本的查询语句 二.指定查询条件 三.注释和SQL语句注意事项 四.运算符 五.谓词 一.基本的查询语句 从表中选取数据时需要使用select语句,也就是只从表中选出(select)必要数 ...

  6. 禅道826版本SQL注入,登录绕过以及禅道826后台GetShell的小技巧

    SQL注入由 orderBy($order) 函数过滤不严格导致.但是,这个函数对传进的参数进行了一系列过滤,导致 getshell 的条件比较苛刻.不甘心,于是乎找了一个比较好利用的地方.我只是以这 ...

  7. dts数据库迁移工具_干货分享丨DM8 DTS工具使用小技巧

    DTS工具的介绍 DM数据库为迁移提供了图形化工具--DTS.DTS可以从主流大型数据库迁移到DM.DM到DM.文件迁移到DM以及DM迁移到文件的功能,极大的简化了迁移操作,让数据迁移变得简单. DT ...

  8. mysql建表测试_总结MySQL建表、查询优化实用小技巧

    MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...

  9. sql left join用法_一张图看懂 SQL 的各种 join 用法

    本文作者:C.L. Moffatt 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法. 具体分解如下: 1.INNER JOIN(内 ...

最新文章

  1. R语言使用hexSticker包将lattice包可视化的结果转换为六角图(六角贴、六角形贴纸、lattice plot to hex sticker)
  2. python3 实现 php bin2hex 函数
  3. deno学习一 安装试用几个问题解决
  4. linux c程序中获取shell脚本输出
  5. Python报表自动化
  6. java poi excel 生成表格的工具封装
  7. .NET Core with 微服务 - Consul 配置中心
  8. 网易邮箱写邮件HTML转换按钮,网易邮箱推出虚拟场景写信功能 身临其境写邮件...
  9. python分类下取得所有子类_如何找到给定名称的类的所有子类?
  10. python socket 域名_python用socket发送http请求
  11. python服务器运维书_python自动化运维书
  12. jest单元测试-基础
  13. 时间序列分析导论书摘:确定自回归过程的阶数
  14. docker挂载目录
  15. 软件质量保证SQA、软件测试ST
  16. 知道创宇获CNNVD年度优秀技术支撑单位及漏洞预警报送专项奖
  17. OpenCV图像预处理常用函数及流程
  18. flutter-dart语言类型后加问号
  19. LeetCode 246/247/248 中心对称数
  20. [PLC]ST语言七:MOV_SMOV_CML_BMOV_FMOV_XCH_BCD_BIN

热门文章

  1. python如何读取公共盘的文档_如何使用 Sphinx 给 Python 代码写文档 | Linux 中国
  2. html怎样设置字体不能被选中,css设置:图片文字等不能被选择
  3. STM32 基础系列教程 11 – ADC 轮询
  4. 都说AIOps是必然趋势,那实践AIOps之前需要做些什么准备?\n
  5. 配置kubernetes服务basic auth
  6. TSC的分歧导致Node.js分支
  7. js数组的sort排序的原理和应用
  8. 如何出色的研究 RGSS3 (三) 形式的调整的细节
  9. 理解HTTP session原理及应用
  10. mysql增删查操作