MySQL中distinct和group by去重的區(qū)別解析
MySQL中distinct和group by去重的區(qū)別
在MySQL中,我們經(jīng)常需要對(duì)查詢結(jié)果進(jìn)行去重,而DISTINCT和GROUP BY是實(shí)現(xiàn)這一功能的兩種常見方法。雖然它們?cè)诤芏嗲闆r下可以互換使用,但它們之間還是存在一些差異的。接下來,我們將通過創(chuàng)建測(cè)試數(shù)據(jù)和執(zhí)行不同的查詢來探討這兩種方法的區(qū)別。
創(chuàng)建測(cè)試數(shù)據(jù)
首先,我們創(chuàng)建一個(gè)測(cè)試表pageview,并插入一些數(shù)據(jù):
SQL代碼:
-- 創(chuàng)建測(cè)試表
DROP TABLE IF EXISTS pageview;
CREATE TABLE pageview (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '自增主鍵',
aid BIGINT NOT NULL COMMENT '文章ID',
uid BIGINT NOT NULL COMMENT '(訪問)用戶ID',
createtime DATETIME DEFAULT NOW() COMMENT '創(chuàng)建時(shí)間'
) DEFAULT CHARSET='utf8mb4';
-- 添加測(cè)試數(shù)據(jù)
INSERT INTO pageview(aid, uid) VALUES(1, 1);
INSERT INTO pageview(aid, uid) VALUES(1, 1);
INSERT INTO pageview(aid, uid) VALUES(2, 1);
INSERT INTO pageview(aid, uid) VALUES(2, 2);DISTINCT使用
DISTINCT的基本語法如下:
SELECT DISTINCT column_name, column_name FROM table_name;
單列去重
根據(jù)aid(文章ID)去重:
SQL代碼:
SELECT DISTINCT aid FROM pageview;
多列去重
根據(jù)aid和uid聯(lián)合去重:
SQL代碼:
SELECT DISTINCT aid, uid FROM pageview;
聚合函數(shù)+去重
使用DISTINCT+聚合函數(shù)計(jì)算aid去重之后的總條數(shù):
SQL代碼:
SELECT COUNT(DISTINCT aid) FROM pageview;
GROUP BY使用
GROUP BY的基礎(chǔ)語法如下:
SELECT column_name, column_name FROM table_name GROUP BY column_name;
單列去重
根據(jù)aid去重:
SQL代碼:
SELECT aid FROM pageview GROUP BY aid;
與DISTINCT相比,GROUP BY可以顯示更多的列,而DISTINCT只能展示去重的列。
多列去重
根據(jù)aid和uid聯(lián)合去重:
SQL代碼:
SELECT aid, uid FROM pageview GROUP BY aid, uid;
聚合函數(shù) + GROUP BY
統(tǒng)計(jì)每個(gè)aid的總數(shù)量:
SQL代碼:
SELECT aid, COUNT(*) FROM pageview GROUP BY aid;
distinct和group by的區(qū)別
查詢結(jié)果集不同
使用DISTINCT去重時(shí),查詢結(jié)果集中只有去重列信息。而使用GROUP BY可以查詢一個(gè)或多個(gè)字段。
使用業(yè)務(wù)場(chǎng)景不同
統(tǒng)計(jì)去重之后的總數(shù)量需要使用DISTINCT,而統(tǒng)計(jì)分組明細(xì)或在分組明細(xì)的基礎(chǔ)上添加查詢條件時(shí),就得使用GROUP BY。
性能不同
如果去重的字段有索引,那么GROUP BY和DISTINCT都可以使用索引,此情況下它們的性能是相同的。而當(dāng)去重的字段沒有索引時(shí),DISTINCT的性能可能會(huì)高于GROUP BY,因?yàn)樵贛ySQL 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)景上,以及性能上都是不同的。了解這些差異可以幫助我們根據(jù)實(shí)際需求選擇更合適的方法。
到此這篇關(guān)于MySQL中distinct和group by去重的區(qū)別的文章就介紹到這了,更多相關(guān)MySQL distinct和group by去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL中數(shù)據(jù)去重的兩種方式詳解(DISTINCT和GROUP BY)
- 詳解MySQL中DISTINCT去重的核心注意事項(xiàng)
- mysql distinct去重,IFNULL空值處理方式
- MySQL中使用distinct單、多字段去重方法
- MySQL中distinct和group?by去重效率區(qū)別淺析
- MySQL去重中distinct和group?by的區(qū)別淺析
- MySQL中使用去重distinct方法的示例詳解
- MySQL去重該使用distinct還是group by?
- Mysql中distinct與group by的去重方面的區(qū)別
- MySQL DISTINCT 去重的幾種方法使用
相關(guān)文章
mysql數(shù)據(jù)庫(kù)中各種鎖歸納總結(jié)
相對(duì)于其他的數(shù)據(jù)庫(kù)而言,MySQL的鎖機(jī)制比較簡(jiǎn)單,最顯著的特點(diǎn)就是不同的存儲(chǔ)引擎支持不同的鎖機(jī)制,這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫(kù)中各種鎖歸納總結(jié)的相關(guān)資料,需要的朋友可以參考下2024-08-08
MySQL5.7 group by新特性報(bào)錯(cuò)1055的解決辦法
項(xiàng)目中本來使用的是mysql5.6進(jìn)行開發(fā),切換到5.7之后,突然發(fā)現(xiàn)原來的一些sql運(yùn)行都報(bào)錯(cuò),錯(cuò)誤編碼1055,錯(cuò)誤信息和sql_mode中的“only_full_group_by“有關(guān)。下面小編給大家分享下解決辦法2016-12-12
mysql數(shù)據(jù)庫(kù)的內(nèi)外連接
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)的內(nèi)外連接,內(nèi)連接實(shí)際上就是利用where子句對(duì)兩種表形成的笛卡兒積進(jìn)行篩選,我們前面學(xué)習(xí)的查詢都是內(nèi)連接,也是在開發(fā)過程中使用的最多的連接查詢,需要的朋友可以參考下2023-07-07
MySQL學(xué)習(xí)(七):Innodb存儲(chǔ)引擎索引的實(shí)現(xiàn)原理詳解

