最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中的group by高級(jí)用法

 更新時(shí)間:2025年04月23日 15:57:04   作者:有夢(mèng)想的攻城獅  
MySQL中的GROUP BY是數(shù)據(jù)聚合分析的核心功能,主要用于將結(jié)果集按指定列分組,并結(jié)合聚合函數(shù)進(jìn)行統(tǒng)計(jì)計(jì)算,下面給大家介紹mysql中的group by用法詳解,感興趣的朋友一起看看吧

MySQL中的GROUP BY是數(shù)據(jù)聚合分析的核心功能,主要用于將結(jié)果集按指定列分組,并結(jié)合聚合函數(shù)進(jìn)行統(tǒng)計(jì)計(jì)算。以下從基本語(yǔ)法到高級(jí)用法進(jìn)行詳細(xì)解析:

一、基本語(yǔ)法與核心功能

SELECT 分組列, 聚合函數(shù)(計(jì)算列)
FROM 表名
[WHERE 條件]
GROUP BY 分組列
[HAVING 分組過(guò)濾條件]
[ORDER BY 排序列];

核心功能

  • 數(shù)據(jù)分組:按一列或多列的值將數(shù)據(jù)劃分為邏輯組。
  • 聚合計(jì)算:對(duì)每個(gè)分組應(yīng)用聚合函數(shù)(如COUNT、SUMAVG、MAX、MIN)進(jìn)行統(tǒng)計(jì)。
  • 結(jié)果過(guò)濾:通過(guò)HAVING對(duì)分組后的結(jié)果進(jìn)行篩選(區(qū)別于WHERE的分組前過(guò)濾)。

二、基礎(chǔ)用法示例

1. 單列分組統(tǒng)計(jì)

統(tǒng)計(jì)每個(gè)部門(mén)的員工數(shù)量和平均工資:

SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;  -- 

2. 多列組合分組

按部門(mén)和職位統(tǒng)計(jì)員工數(shù)量:

SELECT department, job_title, COUNT(*) 
FROM employees
GROUP BY department, job_title;  -- 

3. 與WHERE結(jié)合使用

僅統(tǒng)計(jì)薪資超過(guò)2000元的員工部門(mén)平均工資:

SELECT department, AVG(salary)
FROM employees
WHERE salary > 2000
GROUP BY department;  -- 

三、高級(jí)特性與擴(kuò)展

1. HAVING子句過(guò)濾分組

篩選員工數(shù)量超過(guò)5人的部門(mén):

SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department
HAVING emp_count > 5;  -- 

2. WITH ROLLUP生成匯總行

生成部門(mén)及職位的薪資小計(jì)和總計(jì):

SELECT department, job_title, SUM(salary)
FROM employees
GROUP BY department, job_title WITH ROLLUP;  -- 

3. GROUP_CONCAT合并列值

統(tǒng)計(jì)每個(gè)用戶(hù)購(gòu)買(mǎi)的所有產(chǎn)品(逗號(hào)分隔):

SELECT user_id, GROUP_CONCAT(product_name SEPARATOR ', ') 
FROM orders
GROUP BY user_id;  -- 

4. 按表達(dá)式/函數(shù)分組

按年份統(tǒng)計(jì)訂單數(shù)量:

SELECT YEAR(order_date) AS year, COUNT(*)
FROM orders
GROUP BY YEAR(order_date);  -- 

四、注意事項(xiàng)與常見(jiàn)錯(cuò)誤

ONLY_FULL_GROUP_BY模式
MySQL 8.0+默認(rèn)啟用該模式,要求SELECT中的非聚合列必須出現(xiàn)在GROUP BY中,否則報(bào)錯(cuò)。

-- 錯(cuò)誤示例(salary未聚合且未分組)
SELECT department, salary FROM employees GROUP BY department;
-- 修正方法:添加聚合函數(shù)或分組字段
SELECT department, MAX(salary) FROM employees GROUP BY department;

WHERE與HAVING的區(qū)別

  • WHERE在分組前過(guò)濾行數(shù)據(jù),不可使用聚合函數(shù)。
  • HAVING在分組后過(guò)濾組數(shù)據(jù),必須與聚合條件結(jié)合。

性能優(yōu)化建議

  • 在分組列上創(chuàng)建索引(如ALTER TABLE employees ADD INDEX(department))。
  • 避免對(duì)大表直接分組,可先通過(guò)臨時(shí)表或子查詢(xún)縮小數(shù)據(jù)范圍。

五、經(jīng)典案例場(chǎng)景

1. 按時(shí)間維度聚合

統(tǒng)計(jì)每月的銷(xiāo)售總額:

SELECT YEAR(sale_date) AS year, MONTH(sale_date) AS month, SUM(amount)
FROM sales
GROUP BY year, month;  -- 

2. 多層級(jí)統(tǒng)計(jì)

分析每個(gè)客戶(hù)每年的訂單總金額及平均金額:

SELECT customer_id, YEAR(order_date), 
       SUM(total_amount), AVG(total_amount)
FROM orders
GROUP BY customer_id, YEAR(order_date);  -- 

3. 數(shù)據(jù)去重

查找重復(fù)郵箱的用戶(hù):

SELECT email, COUNT(*) 
FROM users 
GROUP BY email 
HAVING COUNT(*) > 1;  -- 

六、聚合效率優(yōu)化

在MySQL中優(yōu)化GROUP BY聚合效率需要從索引設(shè)計(jì)、查詢(xún)邏輯、執(zhí)行引擎特性等多維度入手。以下基于最新優(yōu)化實(shí)踐和數(shù)據(jù)庫(kù)引擎特性,總結(jié)9大核心優(yōu)化策略:

1、索引優(yōu)化策略

復(fù)合索引精準(zhǔn)匹配分組列
• 創(chuàng)建與GROUP BY順序完全匹配的復(fù)合索引(如GROUP BY a,b則創(chuàng)建(a,b)索引),可觸發(fā)松散索引掃描,減少90%以上的磁盤(pán)I/O。
• 典型案例:當(dāng)對(duì)(department, job_title)分組時(shí),復(fù)合索引idx_dept_job可使查詢(xún)跳過(guò)全表掃描,直接通過(guò)索引完成分組。

覆蓋索引避免回表
• 確保SELECT列與聚合函數(shù)涉及的列均包含在索引中。例如索引(category, sales),查詢(xún)SELECT category, SUM(sales)時(shí)可直接通過(guò)索引完成計(jì)算,無(wú)需訪(fǎng)問(wèn)數(shù)據(jù)行。

利用函數(shù)索引應(yīng)對(duì)復(fù)雜分組
• 對(duì)含表達(dá)式的分組(如YEAR(date_col)),創(chuàng)建虛擬列或函數(shù)索引(MySQL 8.0+支持)。例如:

ALTER TABLE orders ADD COLUMN year_date INT AS (YEAR(order_date)) VIRTUAL;
CREATE INDEX idx_year ON orders(year_date);

2、查詢(xún)?cè)O(shè)計(jì)與執(zhí)行優(yōu)化

減少分組字段數(shù)量與復(fù)雜度
• 每增加一個(gè)分組字段,排序復(fù)雜度呈指數(shù)級(jí)增長(zhǎng)。優(yōu)先合并相關(guān)字段(如將provincecity合并為region字段)。
• 避免在GROUP BY中使用函數(shù),否則索引失效。需改寫(xiě)為基于原字段分組,如將GROUP BY DATE(created_at)改為GROUP BY created_at_date預(yù)計(jì)算列。

分階段過(guò)濾與聚合
• 先通過(guò)子查詢(xún)過(guò)濾無(wú)關(guān)數(shù)據(jù)再分組:

SELECT department, AVG(salary) 
FROM (SELECT * FROM employees WHERE salary > 5000) AS filtered 
GROUP BY department;  -- 比直接HAVING效率提升40%

內(nèi)存排序與臨時(shí)表優(yōu)化
• 調(diào)整tmp_table_sizemax_heap_table_size參數(shù)(建議設(shè)置為物理內(nèi)存的20%),避免臨時(shí)表落盤(pán)。
• 監(jiān)控Created_tmp_disk_tables狀態(tài)變量,若頻繁出現(xiàn)磁盤(pán)臨時(shí)表,需優(yōu)化索引或拆分查詢(xún)。

3、高級(jí)優(yōu)化技術(shù)

分區(qū)表加速大數(shù)據(jù)處理
• 按時(shí)間或業(yè)務(wù)維度分區(qū)(如按月分區(qū)),使GROUP BY僅掃描特定分區(qū)。例如對(duì)10億級(jí)日志表按event_date分區(qū)后,月度統(tǒng)計(jì)耗時(shí)從分鐘級(jí)降至秒級(jí)。

物化視圖與結(jié)果緩存
• 對(duì)高頻聚合查詢(xún)使用物化視圖(如通過(guò)CREATE TABLE mv AS SELECT...定期刷新),減少實(shí)時(shí)計(jì)算壓力。
• 應(yīng)用層緩存重復(fù)查詢(xún)結(jié)果(如Redis緩存日匯總數(shù)據(jù)),降低數(shù)據(jù)庫(kù)負(fù)載。

并行查詢(xún)(MySQL 8.0+)
• 啟用parallel_query功能,通過(guò)多線(xiàn)程處理復(fù)雜分組:

SET SESSION optimizer_switch='parallel_query=on';
SELECT region, SUM(revenue) FROM sales GROUP BY region;  -- 利用多核CPU加速

4、診斷工具與注意事項(xiàng)

執(zhí)行計(jì)劃分析
使用EXPLAIN FORMAT=JSON觀(guān)察using_index(是否用索引)、using_temporary(是否用臨時(shí)表)、filesort(排序方式)等關(guān)鍵指標(biāo)。

嚴(yán)格模式規(guī)避錯(cuò)誤
啟用ONLY_FULL_GROUP_BY模式,防止非聚合列誤用導(dǎo)致結(jié)果不穩(wěn)定。

性能優(yōu)化對(duì)比案例

場(chǎng)景優(yōu)化前耗時(shí)優(yōu)化手段優(yōu)化后耗時(shí)
百萬(wàn)級(jí)用戶(hù)行為分析12.8s創(chuàng)建(user_id,action_time)覆蓋索引1.2s
十億級(jí)日志日聚合3分鐘按日分區(qū)+并行查詢(xún)8秒

通過(guò)上述策略組合,可系統(tǒng)性解決GROUP BY性能瓶頸。實(shí)際應(yīng)用中建議結(jié)合EXPLAIN分析和A/B測(cè)試,選擇最適合業(yè)務(wù)場(chǎng)景的優(yōu)化方案。

七、擴(kuò)展知識(shí)

  • NULL值的處理GROUP BYNULL視為獨(dú)立分組。
  • 排序結(jié)合:分組后使用ORDER BY對(duì)結(jié)果排序(如按平均工資降序)。
  • 動(dòng)態(tài)分組:通過(guò)CASE WHEN實(shí)現(xiàn)條件分組(如按薪資區(qū)間統(tǒng)計(jì))。

通過(guò)靈活組合這些功能,GROUP BY可滿(mǎn)足復(fù)雜的數(shù)據(jù)分析需求。實(shí)際應(yīng)用中需結(jié)合索引優(yōu)化和查詢(xún)邏輯設(shè)計(jì),以提升執(zhí)行效率。

到此這篇關(guān)于mysql中的group by高級(jí)用法的文章就介紹到這了,更多相關(guān)mysql group by用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL延遲關(guān)聯(lián)性能優(yōu)化方法

    MySQL延遲關(guān)聯(lián)性能優(yōu)化方法

    這篇文章主要介紹了MySQL延遲關(guān)聯(lián)性能優(yōu)化方法,本文講解了延遲關(guān)聯(lián)的背景、延遲關(guān)聯(lián)的分析、延遲關(guān)聯(lián)的解決等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • MySQL數(shù)據(jù)庫(kù)的約束與設(shè)計(jì)解讀

    MySQL數(shù)據(jù)庫(kù)的約束與設(shè)計(jì)解讀

    文章介紹了數(shù)據(jù)庫(kù)的約束類(lèi)型,包括非空約束、默認(rèn)約束、唯一約束、主鍵約束、外鍵約束和check約束,并介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)的三大范式:第一范式、第二范式和第三范式,還介紹了如何根據(jù)業(yè)務(wù)需求進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)和創(chuàng)建實(shí)體-關(guān)系圖
    2026-01-01
  • MySQL 使用規(guī)范總結(jié)

    MySQL 使用規(guī)范總結(jié)

    MySQL已經(jīng)成為世界上最受歡迎的數(shù)據(jù)庫(kù)管理系統(tǒng)之一,無(wú)論是用在小型開(kāi)發(fā)項(xiàng)目上,還是用在構(gòu)建那較大型的網(wǎng)站,MySQL都用實(shí)力證明了自己是一個(gè)穩(wěn)定、可靠、快速、可信的系統(tǒng),足以勝任任何數(shù)據(jù)存儲(chǔ)業(yè)務(wù)的需要。本文總結(jié)了MySQL的使用規(guī)范
    2020-09-09
  • Centos中徹底刪除Mysql(rpm、yum安裝的情況)

    Centos中徹底刪除Mysql(rpm、yum安裝的情況)

    這篇文章主要介紹了Centos中徹底刪除Mysql(rpm、yum安裝的情況),本文直接給出操作代碼,需要的朋友可以參考下
    2015-02-02
  • 簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢(xún)

    簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢(xún)

    分析MySQL語(yǔ)句查詢(xún)性能的方法除了使用 EXPLAIN 輸出執(zhí)行計(jì)劃,還可以讓MySQL記錄下查詢(xún)超過(guò)指定時(shí)間的語(yǔ)句,我們將超過(guò)指定時(shí)間的SQL語(yǔ)句查詢(xún)稱(chēng)為“慢查詢(xún)”
    2017-01-01
  • 簡(jiǎn)單介紹MySQL中索引的使用方法

    簡(jiǎn)單介紹MySQL中索引的使用方法

    這篇文章主要介紹了簡(jiǎn)單介紹MySQL中索引的使用方法,是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • 簡(jiǎn)述MySQL InnoDB存儲(chǔ)引擎

    簡(jiǎn)述MySQL InnoDB存儲(chǔ)引擎

    這篇文章主要介紹了MySQL InnoDB存儲(chǔ)引擎的相關(guān)資料,幫助大家更好的了解MySQL的存儲(chǔ)引擎,感興趣的朋友可以了解下
    2020-08-08
  • 查看mysql語(yǔ)句運(yùn)行時(shí)間的2種方法

    查看mysql語(yǔ)句運(yùn)行時(shí)間的2種方法

    網(wǎng)站運(yùn)行很慢的時(shí)候,我就特別起知道為什么這么慢,所以我查啊查,數(shù)據(jù)庫(kù)絕對(duì)是很重要的一部分,里面運(yùn)行的sql是絕對(duì)不能放過(guò)的。平時(shí)做項(xiàng)目的時(shí)候,我也會(huì)注意sql語(yǔ)句的書(shū)寫(xiě),寫(xiě)出一些高效的sql來(lái),所以我會(huì)經(jīng)常測(cè)試自己寫(xiě)的sql語(yǔ)句。我把我知道的二個(gè)方法,總結(jié)一下發(fā)出來(lái)
    2014-01-01
  • 解讀mysql datetime類(lèi)型精確到毫秒、微秒的問(wèn)題

    解讀mysql datetime類(lèi)型精確到毫秒、微秒的問(wèn)題

    這篇文章主要介紹了解讀mysql datetime類(lèi)型精確到毫秒、微秒的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • MySQL用戶(hù)賬戶(hù)管理和權(quán)限管理深入講解

    MySQL用戶(hù)賬戶(hù)管理和權(quán)限管理深入講解

    這篇文章主要給大家介紹了關(guān)于MySQL用戶(hù)賬戶(hù)管理和權(quán)限管理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評(píng)論

曲靖市| 闻喜县| 赣榆县| 玛沁县| 渭南市| 专栏| 宣城市| 达拉特旗| 新和县| 新沂市| 肥东县| 滁州市| 武功县| 台东市| 普兰店市| 蓬莱市| 即墨市| 平南县| 济南市| 迁西县| 钟祥市| 曲沃县| 于田县| 聊城市| 苍梧县| 古丈县| 和硕县| 保康县| 丽江市| 久治县| 荆州市| 天门市| 保靖县| 柯坪县| 图木舒克市| 皮山县| 长沙县| 双峰县| 岗巴县| 沾益县| 盐城市|