MySQL中distinct和group by去重的區(qū)別解析
MySQL中distinct和group by去重的區(qū)別
在MySQL中,我們經(jīng)常需要對查詢結果進行去重,而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去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用MySQL進行千萬級別數(shù)據(jù)查詢的技巧分享
這篇文章主要介紹了如何使用MySQL進行千萬級別數(shù)據(jù)查詢的技巧,文中通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-03-03Linux CentOS MySQL數(shù)據(jù)庫安裝配置教程
這篇文章主要為大家詳細介紹了Linux CentOS MySQL數(shù)據(jù)庫的安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05MySQL中使用case when 語句實現(xiàn)多條件查詢的方法
今天在一個應用中使用到了一個比較特殊的數(shù)據(jù)查詢要求。需要的朋友可以參考下。2010-12-12MySQL數(shù)據(jù)庫子查詢語法規(guī)則詳解
子查詢是在查詢語句里面再嵌套一個查詢,這是因為我們在提取數(shù)據(jù)的時候有很多不知道的數(shù)據(jù)產(chǎn)生了依賴關系。本文為大家總結了一下MySQL數(shù)據(jù)庫子查詢語法規(guī)則,感興趣的可以了解一下2022-08-08MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題
這篇文章主要介紹了MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題 ,需要的朋友可以參考下2019-07-07