在工做中,咱們常常會發現表中會存在重複數據,那麼如何找出和刪除這些數據呢?spa
下面,以一個小例子來講明:code
一、建立學生表blog
1 CREATE TABLE student( 2 id INT PRIMARY KEY, 3 stuno VARCHAR(12) NOT NULL, 4 stuname VARCHAR(30) NOT null 5 );
二、向學生表中插入數據ci
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','小李');
三、查找僅學號重複的記錄get
從插入記錄上看,id爲一、五、6的記錄學號都是相同的,那麼驗證一下查詢的數據是否正確table
1 -- 學號重複 2 -- 先按學號進行分組,而後查詢學數量 > 1的記錄的學號 3 SELECT * FROM student WHERE stuno IN ( 4 -- 查找重複的學號 5 SELECT stuno FROM student GROUP BY stuno HAVING COUNT(stuno) > 1 6 );
查詢結果以下:class
查詢結果和咱們事先分析的數據一致,因此查詢結果是正確的。date
四、查找學號和姓名均重複的記錄im
從插入記錄上看,只有id爲一、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 );
查詢結果以下:
查詢結果和咱們事先分析的數據一致,因此查詢結果是正確的。
五、刪除多餘的重複記錄(多個字段),只保留最小id的記錄
重複記錄可能有多條,可是咱們只但願保留id最小的那條記錄,由於學號和姓名均重複的只有id爲一、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