MySQL查詢和刪除重複記錄

在工做中,咱們常常會發現表中會存在重複數據,那麼如何找出和刪除這些數據呢?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

相關文章
相關標籤/搜索