MySQL中distinct和group by去重的區(qū)別解析
MySQL中distinct和group by去重的區(qū)別
在MySQL中,我們經常需要對查詢結果進行去重,而DISTINCT和GROUP BY是實現(xiàn)這一功能的兩種常見方法。雖然它們在很多情況下可以互換使用,但它們之間還是存在一些差異的。接下來,我們將通過創(chuàng)建測試數(shù)據(jù)和執(zhí)行不同的查詢來探討這兩種方法的區(qū)別。
創(chuàng)建測試數(shù)據(jù)
首先,我們創(chuàng)建一個測試表pageview,并插入一些數(shù)據(jù):
SQL代碼:
-- 創(chuàng)建測試表
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)建時間'
) DEFAULT CHARSET='utf8mb4';
-- 添加測試數(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ù)計算aid去重之后的總條數(shù):
SQL代碼:
SELECT COUNT(DISTINCT aid) FROM pageview;
GROUP BY使用
GROUP BY的基礎語法如下:
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)計每個aid的總數(shù)量:
SQL代碼:
SELECT aid, COUNT(*) FROM pageview GROUP BY aid;
distinct和group by的區(qū)別
查詢結果集不同
使用DISTINCT去重時,查詢結果集中只有去重列信息。而使用GROUP BY可以查詢一個或多個字段。
使用業(yè)務場景不同
統(tǒng)計去重之后的總數(shù)量需要使用DISTINCT,而統(tǒng)計分組明細或在分組明細的基礎上添加查詢條件時,就得使用GROUP BY。
性能不同
如果去重的字段有索引,那么GROUP BY和DISTINCT都可以使用索引,此情況下它們的性能是相同的。而當去重的字段沒有索引時,DISTINCT的性能可能會高于GROUP BY,因為在MySQL 8.0之前,GROUP BY有一個隱藏的功能會進行默認的排序,這樣就會觸發(fā)filesort從而導致查詢性能降低。
總結
大部分場景下DISTINCT是特殊的GROUP BY,但二者也有細微的區(qū)別,比如它們在查詢結果集上、使用的具體業(yè)務場景上,以及性能上都是不同的。了解這些差異可以幫助我們根據(jù)實際需求選擇更合適的方法。
到此這篇關于MySQL中distinct和group by去重的區(qū)別的文章就介紹到這了,更多相關MySQL distinct和group by去重內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL數(shù)據(jù)讀寫分離MaxScale相關配置
這篇文章主要為大家介紹了MySQL數(shù)據(jù)讀寫分離MaxScale相關配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
mysql獲取指定時間段中所有日期或月份的語句(不設存儲過程,不加表)
最近需要用mysql獲取一個時間段中的所有月份,網上查都是要設置存儲過程或者加一個日期表的,不滿足我的需求,翻墻找資料加上自己試驗,如下代碼分享給大家2021-06-06
Finished with error:Navicat運行SQL文件報錯的解決
詳解數(shù)據(jù)庫varchar與char有哪些區(qū)別

