在工作中,我们经常会发现表中会存在重复数据,那么如何找出和删除这些数据呢?

下面,以一个小例子来说明:

1、创建学生表

1 CREATE TABLE student(
2 id INT PRIMARY KEY,
3 stuno VARCHAR(12) NOT NULL,
4 stuname VARCHAR(30) NOT null
5 );

2、向学生表中插入数据

1 INSERT INTO student VALUES ('1','131111099','小李');
2 INSERT INTO student VALUES ('2','131111100','小陈');
3 INSERT INTO student VALUES ('3','131111101','小王');
4 INSERT INTO student VALUES ('4','131111102','小黑');
5 INSERT INTO student VALUES ('5','131111099','小曹');
6 INSERT INTO student VALUES ('6','131111099','小李');

3、查找仅学号重复的记录

从插入记录上看,id为1、5、6的记录学号都是相同的,那么验证一下查询的数据是否正确

1 -- 学号重复
2 -- 先按学号进行分组,然后查询学数量 > 1的记录的学号
3 SELECT * FROM student WHERE stuno IN (
4 -- 查找重复的学号
5 SELECT stuno FROM student GROUP BY stuno HAVING COUNT(stuno) > 1
6 );

查询结果如下:

查询结果和我们事先分析的数据一致,所以查询结果是正确的。

4、查找学号和姓名均重复的记录

从插入记录上看,只有id为1、6的记录学号和姓名是完全重复的,那么验证一下查询的数据是否正确

1 -- 学号和姓名均重复
2 SELECT * FROM student WHERE (stuno,stuname) -- 注意:此处一定要加括号,当成联合字段来处理
3 IN (
4 -- 查找学号和姓名均重复的学生信息
5 SELECT stuno,stuname FROM student GROUP BY stuno,stuname HAVING COUNT(1) > 1
6 );

查询结果如下:

查询结果和我们事先分析的数据一致,所以查询结果是正确的。

5、删除多余的重复记录(多个字段),只保留最小id的记录

重复记录可能有多条,但是我们只希望保留id最小的那条记录,因为学号和姓名均重复的只有id为1、6的记录,保留id为1的记录,那么验证一下查询的数据是否正确

 1 -- 删除多余的重复记录(多个字段),只保留最小id的记录
2 DELETE FROM student WHERE id IN (
3 SELECT * FROM (
4 SELECT id FROM student WHERE (stuno,stuname) -- 注意:此处一定要加括号,当成联合字段来处理
5 IN (
6 -- 查找学号和姓名均重复的学生信息
7 SELECT stuno,stuname FROM student GROUP BY stuno,stuname HAVING COUNT(1) > 1
8 ) AND id NOT IN (
9 -- 查询最小id的记录
10 SELECT MIN(id) FROM student GROUP BY stuno,stuname HAVING COUNT(1) > 1
11 )
12 ) AS stu_repeat_copy
13
14 );
   1 -- 删除重复数据(删除一条)
     -- delete from student where id in (select * from (SELECT id from student a GROUP BY jgpy(唯一id) having COUNT(*) >1) tmp)
 

查询结果如下:

可以看出,id为6的记录已经被删除了,所以结果正确

警告:不能根据本表的查询结果来更新本表的数据

来源:https://i-beta.cnblogs.com/posts/edit

新MySQL查询和删除重复记录的更多相关文章

  1. MySQL查询及删除重复记录的方法

    查询及删除重复记录的方法(一)1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select p ...

  2. [SQL]查询及删除重复记录的SQL语句

    一:查询及删除重复记录的SQL语句1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select ...

  3. Oracle 查询并删除重复记录的SQL语句

    查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select  ...

  4. oracle_SQL 实验查询及删除重复记录 依据条件 (row)

    除数据库表中的重复记录 根据条件 ① 创建表准备数据 创建表 tab_test -- Create table create table TAB_TEST ( ID NUMBER, NAME NVAR ...

  5. oracle 查询及删除重复记录的SQL语句

    查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group ...

  6. MySQL中查询、删除重复记录的方法大全

    查找所有重复标题的记录: select title,count(*) as count from user_table group by title having count>1; SELECT ...

  7. SQL操作语句之查询及删除重复记录的方法

    delete from 表 where id not in(select min(id) from 表 group by name ) //删除重复名字的记录 删除之前请用语句 select * fr ...

  8. MySQL查询和删除重复数据

    删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 ...

  9. 查询及删除重复记录的SQL语句

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from ...

随机推荐

  1. flutter 下拉加载+下拉加载

    功能: 1.下拉加载 2.上拉加载 3.显示加载图标 4.更新列表数据,隐藏加载图标 flutter库: flutter_spinkit: ^3.1.0 加载图标 其他:加载列表需要列表,基于上一节的 ...

  2. HTML元素分类 块级元素 内联元素 块级内联元素

    概述 HTML中存在许多元素,如<h1>,<p>,<a>,<block>,<image>,这些元素可分为三类,依次是块级元素,内联元素,块级 ...

  3. HTML——CSS基础

    一.引入CSS样式表 1.行内式 通过标记的style属性来设置元素的样式.基本语法如下: <标记名 style="属性1:属性值1; 属性2:属性值2; 属性3:属性值3;" ...

  4. ArcGIS Server 10.4切片图的制作与发布

    场景:有一张遥感卫星图,需要以切片图的形式发布 需要的资料:tif的格式遥感图像 发布步骤: 1.选择Service Editor-->Parameters-->Anti-Aliasing ...

  5. Python 類和對象 Class vs Object

    類別定義 class 類別名: 例如: >>> class Point:...     x = 0.0...     y = 0.0 1. 宣告 >>> p1 = ...

  6. UIView设置阴影

    UI设计师有时候希望我们的产品比较酷. 阴影是他们喜欢的效果之一. 怎么设置阴影呢? 1.设置一个四边都相同的阴影 UIImageView *testImgView = [[UIImageView a ...

  7. dedecmsV5.7 arclist标签同时取出主表和附表里的数据

    {dede:arclist}{/dede:arclist}标签默认取出来的是主表x_archives中的数据,如果要取出附表中的数据,需要满足两个条件: 指定channelid属性(注意:channe ...

  8. Java学习笔记(5)--- Number类和Math 类,String类的应用,Java数组入门

    1.Number 和 Math 类: 在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型(int,double,float这些)的情形. 这种由编译器特别支持的包装称为装箱,所以当内置数 ...

  9. dom0、dom2、dom3事件

    https://www.jianshu.com/p/3acdf5f71d5b addEventListener():可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用. removeEven ...

  10. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8-1

    18.6.5  获取数据 PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成.不管使用PDO对象中的query()方法,还是使用prepare()和exe ...