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

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

1、创建学生表

1 CREATE TABLEstudent(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 ) ASstu_repeat_copy13

14 );

查询结果如下:

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

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

在其它的帖子中有看到如下写法来删除重复数据:

1 DELETE FROM student WHERE (stuno,stuname) --注意:此处一定要加括号,当成联合字段来处理

2 IN(3 --查找学号和姓名均重复的学生信息

4 SELECT stuno,stuname FROM student GROUP BY stuno,stuname HAVING COUNT(1) > 1

5 ) AND id NOT IN(6 --查询最小id的记录

7 SELECT MIN(id) FROM student GROUP BY stuno,stuname HAVING COUNT(1) > 1

8 );

会报如下错误:

[Err] 1093 - You can't specify target table 'student' for update in FROM clause

mysql 删除重复_MySQL查询和删除重复记录相关推荐

  1. mysql的联表查询和去重复数据

    mysql的联表查询和去重复数据 /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.7.17-log : Database - pusmtnew ********** ...

  2. mysql 重复字段查询及排除重复值

    转载链接:http://blog.sina.com.cn/s/blog_3edc5e2e010131ys.html mysql 重复字段查询及排除重复值 SELECT a.id,a.title FRO ...

  3. mysql 统计 邮箱_mysql查询之 连续出现的数字,重复出现的邮箱,删除重复的电子邮箱...

    1.编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | ...

  4. mysql选出重复的字段_mysql查询表里的重复数据方法:

    INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11') delete from hk_test  ...

  5. mysql查询表里面重复的数据_mysql查询表里的重复数据方法

    这篇文章主要介绍了mysql查询表里的重复数据方法,需要的朋友可以参考下 INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),( ...

  6. mysql delete 表关联删除数据_MYSQL中delete删除多表数据与删除关联数据

    在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例. 1.delete from t1 where 条件 ...

  7. 在mysql中通配符_mysql查询中通配符的使用

    mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: "_& ...

  8. mysql 严格区分大小写_Mysql查询英文如何严格区分大小写?

    1. 前提: 在Mysql数据库中进行查询时,希望英文严格区分大小写.默认情况下是不区分大小写的. 2. 演示如下: 在数据库表emp中,job字段中存储的值有'Engineer',现在的情况是,下面 ...

  9. mysql 查找数据_Mysql查询数据

    查询语句 单表查询 1.1 全表查寻 select * from employee; 复制代码1.2 指定字段查询 查询职员表中所有职员姓名和入职时间 select empname,hirdate f ...

最新文章

  1. 《Redis设计与实现》阅读笔记(二)--简单动态字符串
  2. 关于面象接口编程的理解
  3. common.php中路径,关于ThinkPHP中Common/common.php文件常用函数的功能分析
  4. SpringBoot中关于Shiro权限管理的整合使用
  5. 看看老外是如何理解抽象类的
  6. 无法安装软件之解决其一 (windows installer服务篇)
  7. WEB-UI自动化测试实践
  8. 中英文对照 —— 哲学
  9. ClassNotFoundException和NoClassDefError之间的区别
  10. jcr一区是什么意思_SCI分区中JCR分区和中科院分区的三点区别
  11. java基础70 负责静态的网页制作语言XML(网页知识)
  12. centos7 文件名中文乱码_CentOS 下中文文件名显示乱码问题
  13. 简单翻译工具--必应词典第三方api使用方法
  14. 新猿木子李:0基础学python培训教程 Python操作Redis之hash类型
  15. python计算日期到天数_利用python计算时间差(返回天数)
  16. AndroidUI和交互整理集合
  17. c8051f单片机c语言看门狗例程,stc单片机看门狗喂狗程序
  18. 学习python[:,:]
  19. vue3下载文件流 下载excel
  20. gradient_accumulation_steps --梯度累加理解

热门文章

  1. Lombok 插件安装、使用
  2. 内网穿透是什么?哪些作用?
  3. bug记录-socket hang up
  4. CS入门学习笔记5-MIT 6.00.1x
  5. MySQL数据库编程01
  6. hadoop之mapreduce教程+案例学习(二)
  7. 基于FaceNet的实时人脸识别训练
  8. 常用CASE工具介绍 (csnd.net)
  9. Ansible批量管理Windows服务器,winrm配置
  10. (五)51单片机基础——矩阵键盘