MySQL?去重實例操作詳解
前言
在 MySQL 中,最常見的去重方法有兩個:使用 distinct 或使用 group by,那它們有什么區(qū)別呢?接下來我們一起來看。
1.創(chuàng)建測試數(shù)據(jù)
最終展現(xiàn)效果如下:
2.distinct 使用
distinct 基本語法如下:
SELECT DISTINCT column_name,column_name FROM table_name;
2.1 單列去重
我們先用 distinct 實現(xiàn)單列去重,根據(jù) aid(文章 ID)去重,具體實現(xiàn)如下:
2.2 多列去重
除了單列去重之外,distinct 還支持多列(兩列及以上)去重,我們根據(jù) aid(文章 ID)和 uid(用戶 ID)聯(lián)合去重,具體實現(xiàn)如下:
2.3 聚合函數(shù)+去重
使用 distinct + 聚合函數(shù)去重,計算 aid 去重之后的總條數(shù),具體實現(xiàn)如下:
3.group by 使用
group by 基礎(chǔ)語法如下:
SELECT column_name,column_name FROM table_name WHERE column_name operator value GROUP BY column_name
3.1 單列去重
根據(jù) aid(文章 ID)去重,具體實現(xiàn)如下:
與 distinct 相比 group by 可以顯示更多的列,而 distinct 只能展示去重的列。
3.2 多列去重
根據(jù) aid(文章 ID)和 uid(用戶 ID)聯(lián)合去重,具體實現(xiàn)如下:
3.3 聚合函數(shù) + group by
統(tǒng)計每個 aid 的總數(shù)量,SQL 實現(xiàn)如下:
從上述結(jié)果可以看出,使用 group by 和 distinct 加 count 的查詢語義是完全不同的,distinct + count 統(tǒng)計的是去重之后的總數(shù)量,而 group by + count 統(tǒng)計的是分組之后的每組數(shù)據(jù)的總數(shù)。
4.distinct 和 group by 的區(qū)別
官方文檔在描述 distinct 時提到:在大多數(shù)情況下 distinct 是特殊的 group by,如下圖所示:
官方文檔地址:但二者還是有一些細(xì)微的不同的,比如以下幾個。
區(qū)別1:查詢結(jié)果集不同
當(dāng)使用 distinct 去重時,查詢結(jié)果集中只有去重列信息,如下圖所示:
當(dāng)你試圖添加非去重字段(查詢)時,SQL 會報錯如下圖所示:
而使用 group by 排序可以查詢一個或多個字段,如下圖所示:
區(qū)別2:使用業(yè)務(wù)場景不同
統(tǒng)計去重之后的總數(shù)量需要使用 distinct,而統(tǒng)計分組明細(xì),或在分組明細(xì)的基礎(chǔ)上添加查詢條件時,就得使用 group by 了。
使用 distinct 統(tǒng)計某列去重之后的總數(shù)量:
統(tǒng)計分組之后數(shù)量大于 2 的文章,就要使用 group by 了,如下圖所示:
區(qū)別3:性能不同
如果去重的字段有索引,那么 group by 和 distinct 都可以使用索引,此情況它們的性能是相同的;而當(dāng)去重的字段沒有索引時,distinct 的性能就會高于 group by,因為在 MySQL 8.0 之前,group by 有一個隱藏的功能會進行默認(rèn)的排序,這樣就會觸發(fā) filesort 從而導(dǎo)致查詢性能降低。
總結(jié)
大部分場景下 distinct 是特殊的 group by,但二者也有細(xì)微的區(qū)別,比如它們在查詢結(jié)果集上、使用的具體業(yè)務(wù)場景上,以及性能上都是不同的。
到此這篇關(guān)于MySQL 去重實例操作詳解的文章就介紹到這了,更多相關(guān)MySQL 去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫查詢優(yōu)化 mysql效率
MySQL由于它本身的小巧和操作的高效, 在數(shù)據(jù)庫應(yīng)用中越來越多的被采用.我在開發(fā)一個P2P應(yīng)用的時候曾經(jīng)使用MySQL來保存P2P節(jié)點,由于P2P的應(yīng)用中,結(jié)點數(shù)動輒上萬個,而且節(jié)點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試. 1. 使用statement進行綁定查詢 2. 隨機的獲取記錄 3. 使用連接池管理連接.2008-01-01Ubuntu18.0.4下mysql 8.0.20 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Ubuntu18.0.4下mysql 8.0.19 安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解
這篇文章主要給大家介紹了關(guān)于mysql存儲過程教程之遍歷多表記錄后插入第三方表中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-07-07mysql存儲過程 游標(biāo) 循環(huán)使用介紹
今天分享下自己對于Mysql存儲過程的認(rèn)識與了解,這里主要說說大家常用的游標(biāo)加循環(huán)的嵌套使用2012-11-11