首頁 > 軟體

SQL刪除重複資料的範例教學

2022-07-05 14:02:13

1 SQL去重

SQL中去除完全相同資料可以用distinct關鍵字,任意欄位去重可以用group by,以下面的資料表為例。

2 distinct

存在兩條完全相同的紀錄,用關鍵字distinct就可以去掉

根據單個欄位去重,能精確去重;

作用在多個欄位時,只有當這幾個欄位的完全相同時,才能去重;

關鍵字distinct只能放在SQL語句中的第一個,才會起作用

一般用來返回不重複的記錄條數,返回不重複的條數(去掉test重複的,就剩下6條)

3 group by

1. 查詢根據名字去重後資料(名字相同取id值大的)

SELECT * FROM stu WHERE id IN (SELECT MAX(id) FROM stu GROUP BY `name`)

2. 刪除名字相同資料(名字相同保留id值大的)

group by + count + max去掉重複資料

1)SELECT * FROM stu

2)加上group by 後,會將重複的資料去掉了

3) 條件(名字)是數量大於1的重複資料

SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(`name`) > 1

#條件是數量大於1的重複資料
SELECT * FROM stu WHERE `name` IN(
SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(`name`)>1 
)

4)檢視某欄位重複資料的id

SELECT id, COUNT(*) FROM stu 
GROUP BY NAME DESC HAVING(COUNT(*) > 0)

5)查詢所有重複資料

SELECT * FROM stu WHERE NAME IN (SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(`name`) > 1)

5) 去重

可以使用distinct去重(返回不重複的使用者名稱)

刪除多餘的重複記錄(name),只保留id最大的記錄。

DELETE FROM stu 
WHERE id NOT IN ( SELECT a.id FROM ( SELECT MAX( id ) AS id FROM stu GROUP BY `name` )a )

或者

 DELETE FROM stu WHERE `name` IN (SELECT `name` FROM (SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(`name`)>1) e)
 AND id NOT IN (SELECT id FROM (SELECT MAX(id) AS id FROM stu GROUP BY `name` HAVING COUNT(`name`)>1) t)
 #查詢顯示重複的資料都是顯示最前面的幾條,因此不需要查詢是否最小值

錯誤刪除

DELETE FROM stu WHERE name IN (SELECT name FROM stu GROUP BY name HAVING COUNT(name)>1)
AND id NOT IN (SELECT MAX(id) FROM stu GROUP BY stu HAVING COUNT(name)>1)

原因是:不能將直接查處來的資料當做刪除資料的條件,我們應該先把查出來的資料新建一個臨時表,然後再把臨時表作為條件進行刪除功能

4 總結

去重後名字記錄

SELECT `name` FROM stu 
GROUP BY NAME HAVING(COUNT(*) > 0)

2)

所有重複名字的記錄

SELECT `name` FROM stu 
GROUP BY NAME HAVING COUNT(*) > 1

3)把所有重複的記錄都刪了

DELETE FROM stu WHERE name IN
(SELECT name FROM stu GROUP BY name HAVING COUNT(*)>1)

無法在刪除時同時查詢這張表,這個問題只在MySQL中出現,oracle沒有。怎麼解決?我們只需要在查出結果以後加一張中間表。讓執行器認為我們要查的資料不是來自正在刪的這張表就可以了。

DELETE FROM stu WHERE `name` IN 
    (SELECT a.name FROM 
        (SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(*)>1) a)

所有重複資料都刪除, 就剩王五一條資料了

4) 現在刪除所有重複資料資料做完了,考慮怎麼保留重複資料中id最小的。只需要在刪除時讓刪除該條的記錄id不在重複資料id最小的當中就可以了。

DELETE FROM stu WHERE `name` IN 
    (SELECT a.name FROM 
        (SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(*)>1) a)
     AND id NOT IN 
    (SELECT b.id FROM 
        (SELECT MIN(id) id FROM stu 
            GROUP BY `name` HAVING COUNT(*)>1) b);

還有簡單辦法 算出去重後所有資料(保留最小ID),然後刪除id不在該陣列裡的

 DELETE FROM stu WHERE id NOT IN (SELECT t.id FROM (SELECT MIN(id) AS id FROM stu GROUP BY `name`)t)

到此這篇關於SQL刪除重複資料的文章就介紹到這了,更多相關SQL刪除重複資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com