新MySQL查询和删除重复记录

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

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

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

原文地址:https://www.cnblogs.com/ykcbwdt/p/11928083.html