MySQL?去重實(shí)例操作詳解
前言
在 MySQL 中,最常見(jiàn)的去重方法有兩個(gè):使用 distinct 或使用 group by,那它們有什么區(qū)別呢?接下來(lái)我們一起來(lái)看。
1.創(chuàng)建測(cè)試數(shù)據(jù)
最終展現(xiàn)效果如下:

2.distinct 使用
distinct 基本語(yǔ)法如下:
SELECT DISTINCT column_name,column_name FROM table_name;
2.1 單列去重
我們先用 distinct 實(shí)現(xiàn)單列去重,根據(jù) aid(文章 ID)去重,具體實(shí)現(xiàn)如下:

2.2 多列去重
除了單列去重之外,distinct 還支持多列(兩列及以上)去重,我們根據(jù) aid(文章 ID)和 uid(用戶 ID)聯(lián)合去重,具體實(shí)現(xiàn)如下:

2.3 聚合函數(shù)+去重
使用 distinct + 聚合函數(shù)去重,計(jì)算 aid 去重之后的總條數(shù),具體實(shí)現(xiàn)如下:

3.group by 使用
group by 基礎(chǔ)語(yǔ)法如下:
SELECT column_name,column_name FROM table_name WHERE column_name operator value GROUP BY column_name
3.1 單列去重
根據(jù) aid(文章 ID)去重,具體實(shí)現(xiàn)如下:

與 distinct 相比 group by 可以顯示更多的列,而 distinct 只能展示去重的列。
3.2 多列去重
根據(jù) aid(文章 ID)和 uid(用戶 ID)聯(lián)合去重,具體實(shí)現(xiàn)如下:

3.3 聚合函數(shù) + group by
統(tǒng)計(jì)每個(gè) aid 的總數(shù)量,SQL 實(shí)現(xiàn)如下:

從上述結(jié)果可以看出,使用 group by 和 distinct 加 count 的查詢語(yǔ)義是完全不同的,distinct + count 統(tǒng)計(jì)的是去重之后的總數(shù)量,而 group by + count 統(tǒng)計(jì)的是分組之后的每組數(shù)據(jù)的總數(shù)。
4.distinct 和 group by 的區(qū)別
官方文檔在描述 distinct 時(shí)提到:在大多數(shù)情況下 distinct 是特殊的 group by,如下圖所示:

官方文檔地址:但二者還是有一些細(xì)微的不同的,比如以下幾個(gè)。
區(qū)別1:查詢結(jié)果集不同
當(dāng)使用 distinct 去重時(shí),查詢結(jié)果集中只有去重列信息,如下圖所示:

當(dāng)你試圖添加非去重字段(查詢)時(shí),SQL 會(huì)報(bào)錯(cuò)如下圖所示:

而使用 group by 排序可以查詢一個(gè)或多個(gè)字段,如下圖所示:

區(qū)別2:使用業(yè)務(wù)場(chǎng)景不同
統(tǒng)計(jì)去重之后的總數(shù)量需要使用 distinct,而統(tǒng)計(jì)分組明細(xì),或在分組明細(xì)的基礎(chǔ)上添加查詢條件時(shí),就得使用 group by 了。
使用 distinct 統(tǒng)計(jì)某列去重之后的總數(shù)量:

統(tǒng)計(jì)分組之后數(shù)量大于 2 的文章,就要使用 group by 了,如下圖所示:

區(qū)別3:性能不同
如果去重的字段有索引,那么 group by 和 distinct 都可以使用索引,此情況它們的性能是相同的;而當(dāng)去重的字段沒(méi)有索引時(shí),distinct 的性能就會(huì)高于 group by,因?yàn)樵?MySQL 8.0 之前,group by 有一個(gè)隱藏的功能會(huì)進(jìn)行默認(rèn)的排序,這樣就會(huì)觸發(fā) filesort 從而導(dǎo)致查詢性能降低。
總結(jié)
大部分場(chǎng)景下 distinct 是特殊的 group by,但二者也有細(xì)微的區(qū)別,比如它們?cè)诓樵兘Y(jié)果集上、使用的具體業(yè)務(wù)場(chǎng)景上,以及性能上都是不同的。
到此這篇關(guān)于MySQL 去重實(shí)例操作詳解的文章就介紹到這了,更多相關(guān)MySQL 去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案詳析
這篇文章主要給大家介紹了關(guān)于MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Mysql清空表數(shù)據(jù)庫(kù)命令truncate和delete詳解
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)清空表truncate和delete的相關(guān)知識(shí),本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
mysql Sort aborted: Out of sort memory, consider increasing
這篇文章主要介紹了mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size的解決方法,需要的朋友可以參考下2016-05-05
千萬(wàn)級(jí)記錄的Discuz論壇導(dǎo)致MySQL CPU 100%的優(yōu)化筆記
談到自己在解決一個(gè)擁有 60 萬(wàn)條記錄的 MySQL 數(shù)據(jù)庫(kù)訪問(wèn)時(shí),導(dǎo)致 MySQL CPU 占用 100% 的經(jīng)過(guò)。在解決問(wèn)題完成優(yōu)化(optimize)之后,我發(fā)現(xiàn) Discuz 論壇也存在這個(gè)問(wèn)題,當(dāng)時(shí)稍微提了一下2010-12-12
Mysql中強(qiáng)大的group?by語(yǔ)句解析
這篇文章主要介紹了Mysql中強(qiáng)大的group?by語(yǔ)句解析,GROUP?BY?語(yǔ)句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。在分組的列上我們可以使用?COUNT,?SUM,?AVG,等函數(shù),需要的朋友可以參考下2023-07-07

