mysql中distinct和group?by的區(qū)別淺析
GROUP BY 和 DISTINCT 都是用于從數(shù)據(jù)庫中選擇唯一值的 SQL 子句。它們之間的主要區(qū)別在于它們的作用方式和應用場景。
GROUP BY 語句用于將數(shù)據(jù)按照一個或多個列進行分組,然后對每個組應用一個聚合函數(shù)(如 COUNT、SUM、AVG 等)以得到每個組的統(tǒng)計結果。GROUP BY 通常用于在查詢中生成匯總信息。例如:
SELECT category, COUNT(*) AS count FROM products GROUP BY category;
以上查詢會按照商品類別將數(shù)據(jù)分組,并統(tǒng)計每個類別的商品數(shù)量。
DISTINCT 語句用于從查詢結果中選擇唯一的值。它可以用于從一個或多個列中選擇唯一的值,也可以用于選擇整行的唯一值。例如:
SELECT DISTINCT category FROM products;
以上查詢會返回所有不同的商品類別。
總的來說,GROUP BY 用于對數(shù)據(jù)進行分組和聚合操作,DISTINCT 則用于選擇唯一的值。GROUP BY 通常用于在查詢中生成匯總信息,而 DISTINCT 則用于選擇不同的值以進行數(shù)據(jù)清理或統(tǒng)計。
此外,GROUP BY 通常會產(chǎn)生比 DISTINCT 更多的結果,因為它按照指定的列進行分組,而每個分組內(nèi)可能包含多個不同的值。例如,在以下查詢中:
SELECT category, supplier FROM products GROUP BY category;
結果會按照商品類別分組,并且對于每個類別,會返回該類別下的任意一條記錄中的供應商信息。這意味著如果一個類別下有多個供應商,那么在結果中會出現(xiàn)多條記錄,而這些記錄的商品類別相同但供應商不同。
與之相比,以下查詢使用 DISTINCT 選擇了不同的商品類別和供應商:
SELECT DISTINCT category, supplier FROM products;
在這種情況下,每個組合(商品類別和供應商)只會出現(xiàn)一次。
需要注意的是,GROUP BY 和 DISTINCT 都會對查詢的性能產(chǎn)生一定的影響。GROUP BY 可能會需要對數(shù)據(jù)進行排序和分組操作,而這些操作需要消耗更多的 CPU 和內(nèi)存資源。因此,在使用 GROUP BY 時需要謹慎,盡可能選擇合適的索引和優(yōu)化查詢語句,以減少查詢的時間和資源消耗。而 DISTINCT 則通常比 GROUP BY 更快,因為它只需要對結果集進行唯一化處理即可。
有索引的情況下:group by和distinct都能使用索引,效率相同。
無索引的情況下:distinct效率高于group by,因為GROUP BY 可能會需要對數(shù)據(jù)進行排序和分組操作。
附:distinct 和 group by 原理
在大多數(shù)例子中,DISTINCT可以被看作是特殊的GROUP BY,它們的實現(xià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。
總結
到此這篇關于mysql中distinct和group by區(qū)別淺析的文章就介紹到這了,更多相關mysql distinct和group by區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 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)コ貜陀涗?/a>
- MySQL中distinct和group by去重的區(qū)別解析
相關文章
MySQL數(shù)據(jù)庫實現(xiàn)高可用架構之MHA的實戰(zhàn)
本文主要介紹了MySQL數(shù)據(jù)庫實現(xiàn)高可用架構之MHA的實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
mysql分配root賬號創(chuàng)建數(shù)據(jù)庫的權限的實現(xiàn)
root用戶通常具有所有的權限,本文主要介紹了mysql分配root賬號創(chuàng)建數(shù)據(jù)庫的權限的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07
linux使用mysqldump+expect+crontab實現(xiàn)mysql周期冷備份思路詳解
這篇文章主要介紹了linux使用mysqldump+expect+crontab實現(xiàn)mysql周期冷備份,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
MySQL并發(fā)更新數(shù)據(jù)時的處理方法
在后端開發(fā)中我們不可避免的會遇見MySQL數(shù)據(jù)并發(fā)更新的情況,作為一名后端研發(fā),如何解決這類問題也是必須要知道的,同時這也是面試中經(jīng)??疾斓闹R點。2019-05-05

