背景介紹
最近在設(shè)計數(shù)據(jù)庫的時候因?yàn)殚_始考慮不周,所以產(chǎn)生了大量的重復(fù)數(shù)據(jù)。現(xiàn)在需要把這些重復(fù)的數(shù)據(jù)刪除掉,使用到的語句就是Group By來完成。為了進(jìn)一步了解這條語句的作用,我打算先從簡單入手。
建一個測試表
復(fù)制代碼 代碼如下:
create table test_group(id int auto_increment primary key, name varchar(32), class varchar(32), score int);
查看表結(jié)構(gòu)
desc test_group
![](/d/20211018/c2c795a601e0a3dcf1b62981f6398b9d.gif)
插入數(shù)據(jù)
![](http://img.jbzj.com/file_images/article/201610/20161022111358432.jpg?2016922111411)
測試開始
我想知道當(dāng)前每一個班級里面最高分?jǐn)?shù)的同學(xué)是誰。
復(fù)制代碼 代碼如下:
select name, class , max(score) from test_group group by class;
![](/d/20211018/bff9ead927a91c5720b6e1b48124e992.gif)
好現(xiàn)在可以插入幾條重復(fù)的數(shù)據(jù)。
復(fù)制代碼 代碼如下:
insert into test_group(name, class, score)values('repeat','B',89);
![](http://img.jbzj.com/file_images/article/201610/20161022111425380.jpg?2016922111432)
現(xiàn)在要過濾掉重復(fù)的數(shù)據(jù),保留最新的那條記錄。一般我們假設(shè)最新的記錄是最后插入的那條,所以它的ID應(yīng)該是最大的那條。
復(fù)制代碼 代碼如下:
select name, class, max(id) from test_group group by name;
![](/d/20211018/09ed2c0c98422d7daa70aed280ba7d1d.gif)
可以發(fā)現(xiàn),我們關(guān)注那個項(xiàng)的重復(fù)性就把它放到gourp by后面。這樣我們就可以過濾掉那些與這個項(xiàng)重復(fù)的記錄啦。現(xiàn)在我們得到了我們需要的數(shù)據(jù),我們下一步就是把那些重復(fù)的數(shù)據(jù)刪除。為了區(qū)分我們過濾出來的數(shù)據(jù)記錄與原有的記錄,我們可以給id取一個別名。
復(fù)制代碼 代碼如下:
select name, class, max(id) as max_id from test_group group by name;
![](http://img.jbzj.com/file_images/article/201610/20161022111456701.jpg?201692211158)
下一步就是把這些關(guān)心的數(shù)據(jù)保留下來,我先把這些數(shù)據(jù)的id
提取出來。因?yàn)檫@個是唯一確定一條記錄的。
復(fù)制代碼 代碼如下:
select max_id from (select name, class, max(id) as max_id from test_group group by name)b;
![](/d/20211018/092d2c4fa479145d5cd53e1864ae00ed.gif)
下面就是刪除操作了。思路就是刪除那些數(shù)據(jù)ID不在我們查詢結(jié)果里面的記錄。為了方便操作后對數(shù)據(jù)的對比,我先進(jìn)行一次全部查詢。
復(fù)制代碼 代碼如下:
select * from test_group;
![](http://img.jbzj.com/file_images/article/201610/20161022111517264.jpg?2016922111530)
執(zhí)行刪除操作。
復(fù)制代碼 代碼如下:
delete from test_group where id not in (select max_id from (select name, class, max(id) as max_id from test_group group by name)b);
最后查看結(jié)果。
![](http://img.jbzj.com/file_images/article/201610/20161022111542735.jpg?2016922111557)
總結(jié)
MySQL操作還是很靈活的,之前一直喜歡用ORM現(xiàn)在感覺直接使用MYSQL省去了很多事。如果你有更好更高效的方式就請你分享分享吧~~
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Mysql利用group by分組排序
- MySQL5.7 group by新特性報錯1055的解決辦法
- sql中 order by 和 group by的區(qū)別
- mysql group by having 實(shí)例代碼
- Mysql中錯誤使用SQL語句Groupby被兼容的情況
- mysql使用GROUP BY分組實(shí)現(xiàn)取前N條記錄的方法
- MySQL優(yōu)化GROUP BY(松散索引掃描與緊湊索引掃描)
- MySQL分組查詢Group By實(shí)現(xiàn)原理詳解
- SQL GROUP BY 詳解及簡單實(shí)例