MYSQL統(tǒng)計(jì)總條數(shù)(需去重)使用的辦法總結(jié)
以下是關(guān)于 SQL 中 GROUP BY 和 DISTINCT 關(guān)鍵字的區(qū)別。
GROUP BY 和 DISTINCT 的區(qū)別
1. 定義
- DISTINCT:
- 用于消除查詢結(jié)果中的重復(fù)行,返回唯一值組合。
- 作用于整個(gè)
SELECT子句的列集。
- GROUP BY:
- 用于將結(jié)果集按指定列分組,通常與聚合函數(shù)(如
COUNT、SUM)結(jié)合使用。 - 返回分組鍵和聚合計(jì)算結(jié)果。
- 用于將結(jié)果集按指定列分組,通常與聚合函數(shù)(如
2. 核心目的不同
- DISTINCT:
- 專注于 去重,確保結(jié)果中無重復(fù)記錄。
- 例如:獲取唯一客戶列表。
- GROUP BY:
- 專注于 分組和聚合,用于生成匯總統(tǒng)計(jì)。
- 例如:計(jì)算每個(gè)地區(qū)的銷售總額。
3. 語法結(jié)構(gòu)差異
- DISTINCT 語法:
- 直接應(yīng)用于
SELECT子句。 - 示例:
SELECT DISTINCT column1, column2 FROM table_name;
- 直接應(yīng)用于
- GROUP BY 語法:
- 需要
GROUP BY子句,且SELECT中必須包含分組列或聚合函數(shù)。 - 示例:
SELECT column1, COUNT(column2) FROM table_name GROUP BY column1;
- 需要
4. 結(jié)果集區(qū)別
- DISTINCT 結(jié)果:
- 返回原始列的唯一組合,不包含額外計(jì)算。
- 輸出行數(shù) ≤ 原始數(shù)據(jù)行數(shù)。
- GROUP BY 結(jié)果:
- 返回分組鍵(如
column1)和聚合值(如COUNT(column2))。 - 輸出行數(shù) = 分組鍵的唯一值數(shù)量。
- 返回分組鍵(如
5. 與聚合函數(shù)的結(jié)合性
- DISTINCT:
- 不能直接與聚合函數(shù)結(jié)合(例如
SELECT DISTINCT COUNT(column)無效)。 - 如需聚合,需嵌套子查詢。
- 不能直接與聚合函數(shù)結(jié)合(例如
- GROUP BY:
- 必須與聚合函數(shù)一起使用(如
SUM、AVG)。 - 聚合函數(shù)作用于每個(gè)分組內(nèi)部。
- 必須與聚合函數(shù)一起使用(如
6. 使用場景對比
- 適用 DISTINCT 時(shí):
- 需要簡單去重,無統(tǒng)計(jì)計(jì)算。
- 示例:列出所有不重復(fù)的產(chǎn)品類別。
- 適用 GROUP BY 時(shí):
- 需要分組統(tǒng)計(jì)或匯總分析。
- 示例:計(jì)算每個(gè)部門的平均工資。
7. 示例對比(基于示例表Employees)
| EmployeeID | Department | Salary |
|---|---|---|
| 1 | HR | 5000 |
| 2 | IT | 6000 |
| 3 | HR | 5500 |
| 4 | IT | 6500 |
DISTINCT 示例:
SELECT DISTINCT Department FROM Employees;
結(jié)果:
Department HR IT GROUP BY 示例:
SELECT Department, AVG(Salary) AS AvgSalary FROM Employees GROUP BY Department;
結(jié)果:
Department AvgSalary HR 5250 IT 6250
8.性能差距比較
在一張百萬級的表里,統(tǒng)計(jì) 根據(jù)指定列 (去重后)的總行數(shù)。
-- 測試DISTINCT性能 EXPLAIN SELECT COUNT(DISTINCT column_name) FROM table_name WHERE conditions; -- 測試GROUP BY性能 EXPLAIN SELECT COUNT(*) FROM ( SELECT column_name FROM table_name WHERE conditions GROUP BY column_name ) as tmp;
1. 一般情況下的性能表現(xiàn)
DISTINCT通常更好,原因如下:
DISTINCT是專門為去重設(shè)計(jì)的操作符,數(shù)據(jù)庫優(yōu)化器對其有專門的優(yōu)化
語法更簡潔,意圖更明確
在大多數(shù)情況下,DISTINCT的執(zhí)行效率更高
2. 選擇依據(jù)條件
- 數(shù)據(jù)量影響:
小到中等數(shù)據(jù)量:DISTINCT性能通常更好
大數(shù)據(jù)量:需要考慮索引和具體查詢條件 - 重復(fù)率影響:
低重復(fù)率(去重后數(shù)據(jù)量接近原始數(shù)據(jù)量):兩者性能相近,DISTINCT略優(yōu)
高重復(fù)率(去重后數(shù)據(jù)量遠(yuǎn)小于原始數(shù)據(jù)量):DISTINCT優(yōu)勢更明顯 - 索引情況:
如果去重字段有索引,DISTINCT性能更好
復(fù)合索引對兩種方法都有幫助
9. 總結(jié)
- DISTINCT:簡單去重工具,適合返回唯一值列表。
- GROUP BY:分組聚合工具,適合生成統(tǒng)計(jì)摘要。
- 關(guān)鍵選擇依據(jù):是否需要聚合計(jì)算——如果需要,用
GROUP BY;如果僅需去重,用DISTINCT。
總結(jié)
到此這篇關(guān)于MYSQL統(tǒng)計(jì)總條數(shù)(需去重)使用辦法的文章就介紹到這了,更多相關(guān)MYSQL統(tǒng)計(jì)去重總條數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql截取的字符串函數(shù)substring_index的用法
這篇文章主要介紹了mysql截取的字符串函數(shù)substring_index的用法,需要的朋友可以參考下2014-08-08
MYSQL神秘的HANDLER命令與實(shí)現(xiàn)方法
這篇文章主要介紹了MYSQL神秘的HANDLER命令與實(shí)現(xiàn)方法,需要的朋友可以參考下2016-07-07
Kettle的MySQL數(shù)據(jù)源版本問題及解決
這篇文章主要介紹了Kettle的MySQL數(shù)據(jù)源版本問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
MySql基礎(chǔ)知識總結(jié)SQL優(yōu)化技巧
本文深入探討了MySQL的SQL優(yōu)化,包括explain分析、索引使用技巧、單表與雙表SQL優(yōu)化、避免索引失效原則、其他優(yōu)化方法及鎖機(jī)制,通過實(shí)例解析,展示了如何通過修改SQL和創(chuàng)建索引來提升查詢性能,感興趣的朋友跟隨小編一起看看吧2025-12-12
mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解
這篇文章主要介紹了mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

