MySQL 分組函數全面詳解與最佳實踐

MySQL 分組函數全面詳解與最佳實踐

MySQL 分組函數(聚合函數)的核心知識、注意事項和高級應用技巧:


📊 分組函數核心列表

函數描述示例
COUNT()計算行數COUNT(*)
SUM()計算數值總和SUM(salary)
AVG()計算平均值AVG(score)
MAX()獲取最大值MAX(price)
MIN()獲取最小值MIN(price)
GROUP_CONCAT()連接分組字符串GROUP_CONCAT(name)
STDDEV()計算標準差STDDEV(price)
VAR_POP()計算總體方差VAR_POP(sales)

?? 分組函數十大注意事項

1. NULL 值處理

SELECT COUNT(*),        -- 所有行數(包含NULL)COUNT(bonus),    -- 非NULL行數AVG(COALESCE(bonus, 0)) -- NULL轉為0計算
FROM employees;

2. 分組字段選擇

-- 錯誤:非分組字段出現在SELECT
SELECT department, name, AVG(salary) 
FROM employees; -- 報錯或未定義行為-- 正確:所有非聚合字段必須出現在GROUP BY
SELECT department, name, AVG(salary)
FROM employees
GROUP BY department, name;

3. WHERE vs HAVING

-- WHERE:分組前過濾行
SELECT department, AVG(salary)
FROM employees
WHERE hire_date > '2020-01-01' -- 先過濾
GROUP BY department;-- HAVING:分組后過濾組
SELECT department, AVG(salary) avg_sal
FROM employees
GROUP BY department
HAVING avg_sal > 5000; -- 后過濾

4. 性能優化策略

-- 低效:全表掃描
SELECT department, AVG(salary)
FROM employees
GROUP BY department;-- 高效:添加索引
ALTER TABLE employees ADD INDEX idx_dept (department);

5. 隱式排序問題

-- 結果順序不保證
SELECT department, COUNT(*)
FROM employees
GROUP BY department;-- 顯式排序
SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department
ORDER BY emp_count DESC;

6. 分組函數嵌套限制

-- 允許:單層分組函數
SELECT AVG(MAX(salary)) -- ? 錯誤嵌套-- 正確:使用子查詢
SELECT AVG(max_sal)
FROM (SELECT department, MAX(salary) AS max_salFROM employeesGROUP BY department
) dept_max;

7. DISTINCT 用法

-- 統計不重復值
SELECT COUNT(DISTINCT department), -- 不同部門數量COUNT(DISTINCT CASE WHEN salary > 5000 THEN 1 END) -- 高薪人數
FROM employees;

8. 空分組處理

-- 使用 COALESCE 處理空分組
SELECT COALESCE(department, '未分配') AS dept,COUNT(*) 
FROM employees
GROUP BY department;

9. 多列分組順序

-- 分組順序影響結果
SELECT YEAR(hire_date) AS hire_year,department,COUNT(*)
FROM employees
GROUP BY hire_year, department; -- 先按年再按部門

10. GROUP_CONCAT 限制

-- 默認截斷長度1024字符
SET SESSION group_concat_max_len = 10000;SELECT department,GROUP_CONCAT(name ORDER BY salary DESC SEPARATOR '|') 
FROM employees
GROUP BY department;

🚀 高級分組技巧

1. 多級分組分析

SELECT YEAR(order_date) AS order_year,QUARTER(order_date) AS quarter,product_category,SUM(amount) AS total_sales,COUNT(DISTINCT customer_id) AS customers
FROM orders
GROUP BY order_year, quarter, product_category
WITH ROLLUP; -- 添加小計和總計行

2. 分組百分比計算

SELECT department,COUNT(*) AS emp_count,ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS pct
FROM employees
GROUP BY department;

3. 分組排名

SELECT department,name,salary,RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

4. 分組比較分析

SELECT department,AVG(salary) AS avg_salary,AVG(salary) - (SELECT AVG(salary) FROM employees) AS diff_from_avg
FROM employees
GROUP BY department;

5. 時間序列分組

SELECT DATE_FORMAT(order_date, '%Y-%m') AS month,SUM(amount) AS monthly_sales,LAG(SUM(amount)) OVER (ORDER BY DATE_FORMAT(order_date, '%Y-%m')) AS prev_month
FROM orders
GROUP BY month;

🔧 性能優化指南

1. 索引策略

-- 復合索引優化分組
ALTER TABLE orders ADD INDEX idx_category_date (product_category, order_date);-- 覆蓋索引
EXPLAIN SELECT product_category, COUNT(*) 
FROM orders 
GROUP BY product_category; -- 使用索引

2. 臨時表優化

-- 增大臨時表內存
SET tmp_table_size = 256*1024*1024; -- 256MB
SET max_heap_table_size = 256*1024*1024;-- 監控臨時表使用
SHOW STATUS LIKE 'Created_tmp%';

3. 分區表優化

-- 按日期分區
CREATE TABLE sales (sale_id INT,sale_date DATE,amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023)
);-- 分區分組查詢
SELECT YEAR(sale_date), SUM(amount)
FROM sales
GROUP BY YEAR(sale_date); -- 僅掃描相關分區

4. 物化視圖(MySQL 8.0+)

-- 創建分組結果緩存
CREATE TABLE sales_summary AS
SELECT product_id, YEAR(order_date) AS year, SUM(amount) AS total
FROM orders
GROUP BY product_id, year;-- 定期刷新
REPLACE INTO sales_summary
SELECT product_id, YEAR(order_date), SUM(amount)
FROM orders
WHERE order_date > (SELECT MAX(order_date) FROM sales_summary)
GROUP BY product_id, YEAR(order_date);

💡 最佳實踐總結

1. 分組設計原則

-- 明確分組粒度
SELECT DATE(order_date) AS day,  -- 按天HOUR(order_time) AS hour, -- 按小時COUNT(*) 
FROM orders
GROUP BY day, hour;

2. 安全處理大數據集

-- 分頁處理大結果集
SELECT department, AVG(salary)
FROM employees
GROUP BY department
LIMIT 10 OFFSET 20; -- 第三頁

3. 結果驗證技巧

-- 驗證分組總數
SELECT COUNT(DISTINCT department) 
FROM employees; -- 應與分組行數一致-- 交叉驗證
SELECT (SELECT COUNT(*) FROM employees) AS total,SUM(emp_count) AS group_total
FROM (SELECT department, COUNT(*) AS emp_countFROM employeesGROUP BY department
) dept_groups;

4. 執行計劃分析

-- 檢查分組性能
EXPLAIN 
SELECT department, AVG(salary)
FROM employees
GROUP BY department;-- 關注以下指標:
-- 1. Using temporary (是否使用臨時表)
-- 2. Using filesort (是否文件排序)
-- 3. key (使用的索引)

5. 避免常見陷阱

-- 陷阱1:錯誤處理NULL
SELECT department, AVG(bonus) -- 忽略NULL
FROM employees;-- 陷阱2:混淆WHERE和HAVING
SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 5000; -- 錯誤!WHERE不能使用聚合函數-- 陷阱3:未排序的分頁
SELECT department, COUNT(*)
FROM employees
GROUP BY department
LIMIT 10; -- 結果隨機

🚀 綜合應用案例

銷售分析報告

SELECT c.country,p.category,YEAR(o.order_date) AS order_year,COUNT(DISTINCT o.customer_id) AS customers,COUNT(*) AS orders,SUM(o.amount) AS revenue,AVG(o.amount) AS avg_order_value,GROUP_CONCAT(DISTINCT p.product_name ORDER BY p.product_name SEPARATOR ', ') AS products
FROM orders o
JOIN products p ON o.product_id = p.id
JOIN customers c ON o.customer_id = c.id
WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY c.country, p.category, order_year WITH ROLLUP
HAVING revenue > 10000
ORDER BY country, category, order_year DESC;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85195.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD 最小循環子數組

1. 題意 給定一個由若干整數組成的數組 nums,請檢查數組是否是由某個子數組重復循環拼接而成,請輸出這個最小的子數組。 2. 題解 利用 k m p kmp kmp中的 n e x t next next數組性質,我們可以求出 n u m s nums nums中的最長公共 前綴后綴…

FreeCAD創作參數化凹形和水波紋式雨水箅子

這種非常流行的美觀的雨水篦子是都市的寵愛,大家要多多去用。 用FC來創建參數化后,設計人員可以隨意修改參數,滿足自身的要求,調整各部件的位置,達到滿意的布局,非常快捷。 水波紋雨水篦子 凹形雨水篦子

如何用一臺服務器用dify私有部署通用的大模型應用?

dify是什么?如何用一臺服務器用dify私有部署通用的大模型應用? Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務(Backend as Service)和LLMOps的理念,使開發者可以快速搭建生產級的生成式 AI 應用…

海洋捕食算法優化BP神經網絡

引言BP神經網絡因梯度下降法的固有缺陷,常出現訓練震蕩和早熟收斂。海洋捕食算法(MPA)受海洋生物覓食行為啟發,其分階段搜索策略(高速游動→自適應步長→局部開發)能有效平衡全局探索與局部開發。本文通過MPA優化BP初始權值及學習率,構建混合優化模型。 方法論2.1 MPA算…

C++/OpenCV 圖像預處理與 PaddleOCR 結合進行高效字符識別

C/OpenCV 圖像預處理與 PaddleOCR 結合進行高效字符識別 在許多實際應用場景中,直接從原始圖片中提取文字的準確率可能不盡人意。圖像中的噪聲、光照不均、角度傾斜等問題都會嚴重干擾 OCR (Optical Character Recognition) 引擎的識別效果。本文將詳細介紹如何利用…

線程的學習

1. 線程 1. 線程是一個進程內部的控制序列 2. 線程在進程內部運行,本質是在進程地址空間內運行 3. 進程:承擔分配系統資源的基本實體 線程:CPU調度的基本單位 4. 線程在進程地址空間內運行 進程訪問的大部分資源都是通過地址空間訪問的 …

Qt Quick 與 QML(三)qml中的基礎控件

一、基礎控件 控件名稱??功能描述??示例代碼??Rectangle?基礎繪圖控件&#xff0c;創建矩形區域Rectangle {width: 100; height: 100<br> color: "red"; radius: 5}?Text/Label?文本顯示控件Text {text: "Hello World";<br> font.pi…

Redis實現消息隊列全解析:從基礎到高級應用實戰

目錄 一、Redis作為消息隊列的優勢與局限 1.1 核心優勢 1.2 適用場景 1.3 局限性及解決方案 二、Redis消息隊列實現方案對比 三、List實現基礎消息隊列 3.1 生產者實現原理 3.2 消費者實現原理 3.3 可靠性增強&#xff1a;ACK機制 四、Pub/Sub實現發布訂閱 4.1 消息發…

Windows應用商店中的國學啟蒙教育應用

國學啟蒙是中國傳統文化教育的重要組成部分&#xff0c;主要以經典誦讀、傳統禮儀、歷史故事等內容為載體&#xff0c;向兒童傳遞中華文化的核心價值觀。幫助孩子建立文化認同感&#xff0c;培養良好的道德觀念和行為習慣。通過學習古代圣賢的言行&#xff0c;兒童可以初步理解…

安科瑞UL認證ADL3000-E/C導軌表:工商業儲能領域的智能之選

一、產品簡介 ADL3000-E/C是安科瑞針對電力系統、工礦企業、公用設施的電力監控及能耗統計、管理需求而精心設計的一款智能儀表。該電能表具有精度高、體積小、安裝方便等顯著優點&#xff0c;為工商業儲能系統的智能化管理提供了強有力的技術支持。 功能特性 測量與計量功能…

條件向量運算與三元表達式

在工程計算和數學建模中&#xff0c;我們經常需要根據條件動態選擇不同的向量運算方式。這種需求在動力學系統、控制理論和計算機圖形學中尤為常見。本文將探討如何通過 Python 的三元表達式結合 SymPy 符號計算庫&#xff0c;實現條件向量運算的高效解決方案。 我們從定義兩…

文檔開發組件Aspose旗下熱門產品優勢及應用場景介紹

?Aspose 是什么&#xff1f; Aspose 是全球領先的文檔處理組件廠商&#xff0c;主打一個字&#xff1a;全。 &#x1f4cc; 支持超 100 種文檔/圖像格式 &#x1f4cc; 覆蓋 Word、Excel、PDF、PPT、OCR、BarCode、Email 等模塊 &#x1f4cc; 支持 .NET、Java、Python、C、N…

龍虎榜——20250618

上證指數縮量長下影小陽線&#xff0c;個股下跌超3300只&#xff0c;總體護盤的板塊表現相對更好。 深證指數縮量收小陽線&#xff0c;橫盤震蕩已有4天&#xff0c;等待方向選擇。 2025年6月18日龍虎榜行業方向分析 1. 半導體 代表標的&#xff1a;滬電股份&#xff08;高階P…

layui和vue父子級頁面及操作

最近在老項目里面添加一些頁面&#xff0c;項目太老只能在原有的項目基礎和插件上添加代碼 html //表格 <table id"dataTable"><thead><tr><th>序號</th><th>名稱</th><th></th></tr></th…

Houdini 節點使用方法

Houdini 的節點系統是其程序化建模和特效制作的核心功能之一&#xff0c;通過節點網絡實現程序化建模、特效制作、動力學模擬等復雜任務。掌握節點使用方法是高效創作的關鍵&#xff0c;以下是圍繞用戶需求的 全面、深入且結構化 的節點使用指南 一、節點基礎操作 1. 創建與連…

license授權文件說明

license管理 1.使用場景 系統將自動檢測license信息是否過期 - license過去前一個月&#xff0c;會顯示warning&#xff1a;license file will expire in 30 days - 當license過去&#xff0c;會顯示license file expired#注意 1. 數據庫重啟時才會啟動 License 授權期限校驗…

C++11中alignof和alignas的入門到精通指南

文章目錄 一、引言二、內存對齊的概念和作用2.1 什么是內存對齊2.2 內存對齊的優勢 三、alignof運算符3.1 定義和作用3.2 語法規則3.3 使用示例3.4 注意事項 四、alignas說明符4.1 定義和作用4.2 語法規則4.3 使用示例4.4 注意事項 五、alignof和alignas的結合使用六、實際應用…

防爆+高性能!ABB 防爆伺服電機HY系列守護安全生產

在石油、化工、火工等高風險行業中&#xff0c;如何在易燃易爆環境中確保設備安全穩定運行&#xff0c;同時兼顧高性能&#xff1f;ABB防爆伺服電機HY系列給出了完美答案&#xff01; 專為爆炸性環境設計&#xff0c;安全與性能兼得 ABB HY系列基于先進的HDS伺服平臺打造&…

洪千武—華為海外HRBP

我的個人介紹 辰熙咨詢創始人&CEO 2005年入職華為人力資源管理部 華為海外首批HRBP推動者、華為TUP股權激勵實戰顧問 華為IBM項目組成員、華為海外代表處AT成員 著有《OKR管理法則》、《力出一孔》 2005年以HR英文專才&#xff0c;從香港著名咨詢公司被獵聘到華為人力…

測試:網絡協議超級詳解

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </