刪除重復(fù)的數(shù)據(jù)方法一這是最笨的一種方式,也是最容易理解的一種方式,效率也比較低 。思路如下:
步驟一
步驟二
步驟三
從上面的過程中,我們一步一步定位到了我們需要刪除的數(shù)據(jù)是哪些 。定位到這些數(shù)據(jù)之后,刪除的時候,只要把查詢語句改為刪除語句即可 。所以最后通過這樣的方式來刪除我時候,我們的刪除語句如下:
delete from user_info where (name,sex,age) in ( select x.* from ( -- 刪除的時候,這里要在包裹一層子查詢select -- 查詢重復(fù)數(shù)據(jù)中,name, sex, age的值name, sex, agefrom user_infogroup by name, sex, agehaving count(*) > 1) as x)and id not in (select min_id from ( -- 刪除的時候,這里要在包裹一層子查詢select -- 查詢重復(fù)數(shù)據(jù)中,最小的id值min(id) as min_idfrom user_info group by name, sex, agehaving count(*) > 1) as y);注意:上面的刪除語句中,我們在兩個where條件中的子查詢語句外面又包裹了一層子查詢,即為上面SQL語句中的as x和as y兩個查詢語句,之所以包裹一層的原因是在程序如下的錯誤提示:
1093 - You can't specify target table 'user_info' for update in FROM clause, Time: 0.084000s上述錯誤的原因是:修改一個表的時候子查詢不能是這被修改的這個表,所以,我們的解決辦法是,在子查詢外面再套一層查詢語句就可以了 。
方法二上面方法一的思路是想辦法找到我們要刪除的數(shù)據(jù)是哪些,然后我們在刪除的時候,使用where條件去匹配這些查詢出來要刪除的數(shù)據(jù)行,以此來達到刪除重復(fù)數(shù)據(jù)的目的 。
換個思路解決
此時,我們不妨換一個角度思考:我們不要去關(guān)注哪些是我們需要刪除的重復(fù)數(shù)據(jù),相反,我們?nèi)リP(guān)注哪些是我們需要留下來的數(shù)據(jù) 。然后我們可以在刪除的時候,使用取反的方式not in我們需要保留下來的數(shù)據(jù),那不是就我們需要刪除的數(shù)據(jù)嗎?
所以,我們想一想哪些使我們需要留下來的數(shù)據(jù)呢?每一組數(shù)據(jù)中,id值最小的哪一行就是我們要保留的數(shù)據(jù)行 。其余的我們就不關(guān)心了 。那么怎么樣才能取到這樣的數(shù)據(jù)行呢?使用下面的SQL語句可以獲取我們需要保留的數(shù)據(jù)行的所有的id的值:
select min(id) from user_info group by name, sex, age;結(jié)果如下:
既然我們想要保留的數(shù)據(jù)行的id集合得到了,在我們要刪除數(shù)據(jù)的where條件中,使用not in我們要保留的id集合,不就是需要刪除的數(shù)據(jù)嗎?刪除重復(fù)數(shù)據(jù)的語句如下:
delete from user_info where id not in(select min_id from (select min(id) as min_idfrom user_info group by name, sex, age) as x);注意:這里為了避免MySQL的1903錯誤,我們也在where條件的子查詢中包裹了另外一個子查詢,即上面SQL中as x查詢語句 。
方法三尋找更高效簡單的方法
通過兩個表關(guān)聯(lián)的方式來刪除數(shù)據(jù),這個方式效率比較高,推薦使用這種方式 。自己和自己關(guān)聯(lián),關(guān)聯(lián)的條件就是我們判斷數(shù)據(jù)是否為重復(fù)數(shù)據(jù)的key 。除此之外,最重要的一個條件是:兩個表的id關(guān)聯(lián)條件,這個是刪除保留數(shù)據(jù)的關(guān)鍵條件 。查詢重復(fù)數(shù)據(jù)的SQL語句如下:
select a.*,b.* from user_info as a inner join user_info as b on a.name = b.name and a.sex = b.sex and a.age = b.ageanda.id > b.id;結(jié)果如下:
寫法1刪除重復(fù)數(shù)據(jù)SQL語句如下:
delete a.*from user_info as a inner join user_info as b on a.name = b.name and a.sex = b.sex and a.age = b.ageanda.id > b.id;寫法2除了上面的那種寫法之外,還有另外一種寫法,如下:
查詢待刪除的重復(fù)數(shù)據(jù)SQL如下:
select * from user_info as a where a.id <> (select min(b.id) from user_info as b where a.name = b.nameand a.sex = b.sexand a.age = b.age);刪除重復(fù)數(shù)據(jù)的SQL語句如下:
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 數(shù)據(jù)同步工具操作方法 同步數(shù)據(jù)在哪里找
- 數(shù)據(jù)庫遷移的兩種方法 oracle數(shù)據(jù)庫遷移方案對比
- java連接數(shù)據(jù)庫步驟 java連接mysql數(shù)據(jù)庫代碼
- 兩種調(diào)用Excel函數(shù)的操作方法 vb調(diào)用excel數(shù)據(jù)百度搜索
- 網(wǎng)絡(luò)測速檢查軟件 怎么測試數(shù)據(jù)流量的網(wǎng)速
- 誤刪excel文件數(shù)據(jù)恢復(fù)方法 wps表格數(shù)據(jù)恢復(fù)方法
- 不收費的數(shù)據(jù)恢復(fù)軟件推薦 免費手機數(shù)據(jù)恢復(fù)軟件APP
- 兩個excel表快速核對 常用的excel數(shù)據(jù)比對工具
- redis保證和數(shù)據(jù)庫事務(wù)一致 redis和mysql數(shù)據(jù)同步原理
- 網(wǎng)頁連接mysql數(shù)據(jù)庫 jsp連接mysql設(shè)置
