mysql中distinct和group?by的區(qū)別淺析
GROUP BY 和 DISTINCT 都是用于從數(shù)據(jù)庫中選擇唯一值的 SQL 子句。它們之間的主要區(qū)別在于它們的作用方式和應(yīng)用場景。
GROUP BY 語句用于將數(shù)據(jù)按照一個或多個列進行分組,然后對每個組應(yīng)用一個聚合函數(shù)(如 COUNT、SUM、AVG 等)以得到每個組的統(tǒng)計結(jié)果。GROUP BY 通常用于在查詢中生成匯總信息。例如:
SELECT category, COUNT(*) AS count FROM products GROUP BY category;
以上查詢會按照商品類別將數(shù)據(jù)分組,并統(tǒng)計每個類別的商品數(shù)量。
DISTINCT 語句用于從查詢結(jié)果中選擇唯一的值。它可以用于從一個或多個列中選擇唯一的值,也可以用于選擇整行的唯一值。例如:
SELECT DISTINCT category FROM products;
以上查詢會返回所有不同的商品類別。
總的來說,GROUP BY 用于對數(shù)據(jù)進行分組和聚合操作,DISTINCT 則用于選擇唯一的值。GROUP BY 通常用于在查詢中生成匯總信息,而 DISTINCT 則用于選擇不同的值以進行數(shù)據(jù)清理或統(tǒng)計。
此外,GROUP BY 通常會產(chǎn)生比 DISTINCT 更多的結(jié)果,因為它按照指定的列進行分組,而每個分組內(nèi)可能包含多個不同的值。例如,在以下查詢中:
SELECT category, supplier FROM products GROUP BY category;
結(jié)果會按照商品類別分組,并且對于每個類別,會返回該類別下的任意一條記錄中的供應(yīng)商信息。這意味著如果一個類別下有多個供應(yīng)商,那么在結(jié)果中會出現(xiàn)多條記錄,而這些記錄的商品類別相同但供應(yīng)商不同。
與之相比,以下查詢使用 DISTINCT 選擇了不同的商品類別和供應(yīng)商:
SELECT DISTINCT category, supplier FROM products;
在這種情況下,每個組合(商品類別和供應(yīng)商)只會出現(xiàn)一次。
需要注意的是,GROUP BY 和 DISTINCT 都會對查詢的性能產(chǎn)生一定的影響。GROUP BY 可能會需要對數(shù)據(jù)進行排序和分組操作,而這些操作需要消耗更多的 CPU 和內(nèi)存資源。因此,在使用 GROUP BY 時需要謹(jǐn)慎,盡可能選擇合適的索引和優(yōu)化查詢語句,以減少查詢的時間和資源消耗。而 DISTINCT 則通常比 GROUP BY 更快,因為它只需要對結(jié)果集進行唯一化處理即可。
有索引的情況下:group by和distinct都能使用索引,效率相同。
無索引的情況下:distinct效率高于group by,因為GROUP BY 可能會需要對數(shù)據(jù)進行排序和分組操作。
附:distinct 和 group by 原理
在大多數(shù)例子中,DISTINCT可以被看作是特殊的GROUP BY,它們的實現(xiàn)都基于分組操作,且都可以通過松散索引掃描、緊湊索引掃描(關(guān)于索引掃描的內(nèi)容會在其他文章中詳細介紹,就不在此細致介紹了)來實現(xiàn)。
DISTINCT和GROUP BY都是可以使用索引進行掃描搜索的。例如以下兩條 sql(只單單看表格最后 extra 的內(nèi)容),我們對這兩條 sql 進行分析,可以看到,在 extra 中,這兩條 sql 都使用了緊湊索引掃描Using index for group-by。
所以,在一般情況下,對于相同語義的DISTINCT和GROUP BY語句,我們可以對其使用相同的索引優(yōu)化手段來進行優(yōu)化。
但對于GROUP BY來說,在 MYSQL8.0 之前,GROUP Y默認會依據(jù)字段進行隱式排序。
可以看到,下面這條 sql 語句在使用了臨時表的同時,還進行了 filesort。
總結(jié)
到此這篇關(guān)于mysql中distinct和group by區(qū)別淺析的文章就介紹到這了,更多相關(guān)mysql distinct和group by區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL中的distinct與group by比較使用方法
- MySQL去重該使用distinct還是group by?
- Mysql中distinct與group by的去重方面的區(qū)別
- MySQL中distinct與group by語句的一些比較及用法講解
- MySQL中distinct語句的基本原理及其與group by的比較
- MySQL中Distinct和Group By語句的基本使用教程
- MySQL中distinct與group by之間的性能進行比較
- 解析mysql中:單表distinct、多表group by查詢?nèi)コ貜?fù)記錄
- MySQL中distinct和group by去重的區(qū)別解析
相關(guān)文章
MySQL?優(yōu)化?index?merge引起的死鎖分析
這篇文章主要介紹了MySQL?優(yōu)化?index?merge引起的死鎖分析,MySQL通過優(yōu)化索引合并是遇到的死鎖問題,下面具體分析需要的小伙伴可以參考一下2022-04-04解決MySQL server has gone away錯誤的方案
在本篇文章里小編給大家分享的是一篇關(guān)于MySQL server has gone away錯誤的解決辦法,有需要的朋友們可以參考下。2020-02-02mysql實現(xiàn)將date字段默認值設(shè)置為CURRENT_DATE
這篇文章主要介紹了mysql實現(xiàn)將date字段默認值設(shè)置為CURRENT_DATE問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07