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 );

查詢結果如下:

可以看出,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM