您好,登錄后才能下訂單哦!
這篇文章主要介紹“SQL怎么刪除重復數據”,在日常操作中,相信很多人在SQL怎么刪除重復數據問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SQL怎么刪除重復數據”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
SQL中去除完全相同數據可以用distinct關鍵字,任意字段去重可以用group by,以下面的數據表為例。
存在兩條完全相同的紀錄,用關鍵字distinct就可以去掉
根據單個字段去重,能精確去重;
作用在多個字段時,只有當這幾個字段的完全相同時,才能去重;
關鍵字distinct只能放在SQL語句中的第一個,才會起作用
一般用來返回不重復的記錄條數,返回不重復的條數(去掉test重復的,就剩下6條)
SELECT * FROM stu WHERE id IN (SELECT MAX(id) FROM stu GROUP BY `name`)
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)
原因是:不能將直接查處來的數據當做刪除數據的條件,我們應該先把查出來的數據新建一個臨時表,然后再把臨時表作為條件進行刪除功能
去重后名字記錄
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
(SELECTname
FROM stu GROUP BYname
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怎么刪除重復數據”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。