京東筆試題:如何實現(xiàn) MySQL 刪除重復記錄并且只保留一條?
作者:千g 來源:blog.csdn.net/n950814abc/article/details/82284838
一、單個字段的操作
分組介紹
Select 重復字段 From 表 Group By 重復字段 Having Count(*)>1GROUP BY <列名序列>
HAVING <組條件表達式>
1. 查詢?nèi)恐貜偷臄?shù)據(jù)
Select * From 表 Where 重復字段 In (Select 重復字段 From 表 Group By 重復字段 Having Count(*)>1)2. 刪除全部重復試題
DELETEFROMdeptWHEREdname IN (SELECTdnameFROMdeptGROUP BYdnameHAVINGcount(1) > 1)
3. 查詢表中多余重復試題(根據(jù)depno來判斷,除了rowid最小的一個)
a. 第一種方法
SELECT*FROMdeptWHEREdname IN (SELECTdnameFROMdeptGROUP BYdnameHAVINGCOUNT(1) > 1)AND deptno NOT IN (SELECTMIN(deptno)FROMdeptGROUP BYdnameHAVINGCOUNT(1) > 1)
b. 第二種方法
SELECT *FROMdeptWHEREdeptno NOT IN (SELECTdt.minnoFROM(SELECTMIN(deptno) AS minnoFROMdeptGROUP BYdname) dt)
c. 補充第三種方法
SELECT*FROMtable_name AS taWHEREta.唯一鍵 <> ( SELECT max( tb.唯一鍵 ) FROM table_name AS tb WHERE ta.判斷重復的列 = tb.判斷重復的列 );
4. 刪除表中多余重復試題并且只留1條
a. 第一種方法:
DELETEFROMdeptWHEREdname IN (SELECTt.dnameFROM(SELECTdnameFROMdeptGROUP BYdnameHAVINGcount(1) > 1) t)AND deptno NOT IN (SELECTdt.mindeptnoFROM(SELECTmin(deptno) AS mindeptnoFROMdeptGROUP BYdnameHAVINGcount(1) > 1) dt)
b. 第二種方法(與上面查詢的第二種方法對應,只是將select改為delete)
DELETEFROMdeptWHEREdeptno NOT IN (SELECTdt.minnoFROM(SELECTMIN(deptno) AS minnoFROMdeptGROUP BYdname) dt)
c. 補充第三種方法(評論區(qū)推薦的一種方法)
DELETEFROMtable_name AS taWHEREta.唯一鍵 <> (SELECTt.maxidFROM( SELECT max( tb.唯一鍵 ) AS maxid FROM table_name AS tb WHERE ta.判斷重復的列 = tb.判斷重復的列 ) t);
二、多個字段的操作
DELETEFROMdeptWHERE(dname, db_source) IN (SELECTt.dname,t.db_sourceFROM(SELECTdname,db_sourceFROMdeptGROUP BYdname,db_sourceHAVINGcount(1) > 1) t)AND deptno NOT IN (SELECTdt.mindeptnoFROM(SELECTmin(deptno) AS mindeptnoFROMdeptGROUP BYdname,db_sourceHAVINGcount(1) > 1) dt)
# 總結
在經(jīng)常查詢的字段上加上索引
將*改為你需要查詢出來的字段,不要全部查詢出來
小表驅(qū)動大表用IN,大表驅(qū)動小表用EXISTS。IN適合的情況是外表數(shù)據(jù)量小的情況,而不是外表數(shù)據(jù)大的情況,因為IN會遍歷外表的全部數(shù)據(jù),假設a表100條,b表10000條那么遍歷次數(shù)就是100*10000次,而exists則是執(zhí)行100次去判斷a表中的數(shù)據(jù)是否在b表中存在,它只執(zhí)行了a.length次數(shù)。至于哪一個效率高是要看情況的,因為in是在內(nèi)存中比較的,而exists則是進行數(shù)據(jù)庫查詢操作的。
正文結束
1.不認命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵志故事
5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結果懵了...
一個人學習、工作很迷茫?
點擊「閱讀原文」加入我們的小圈子!

評論
圖片
表情
