# MySQL中的聚合函數怎么用
## 一、聚合函數概述
### 1.1 什么是聚合函數
聚合函數(Aggregate Functions)是SQL中用于對一組值執行計算并返回單個值的特殊函數。這些函數通常與GROUP BY子句結合使用,用于對數據進行分組統計和分析。
在MySQL中,聚合函數通過對多行數據進行計算,將多行數據"聚合"為單個匯總結果。常見的聚合函數包括COUNT()、SUM()、AVG()、MAX()、MIN()等。
### 1.2 聚合函數的特點
1. **單值返回**:無論處理多少行數據,最終只返回一個計算結果
2. **忽略NULL值**:大多數聚合函數會自動忽略NULL值(COUNT(*)除外)
3. **與GROUP BY配合**:通常用于分組統計
4. **性能考慮**:在大數據量時可能影響查詢性能
### 1.3 常用聚合函數列表
| 函數名 | 功能描述 | 語法示例 |
|--------|----------|----------|
| COUNT() | 計數 | COUNT(expr) |
| SUM() | 求和 | SUM(column) |
| AVG() | 平均值 | AVG(column) |
| MAX() | 最大值 | MAX(column) |
| MIN() | 最小值 | MIN(column) |
| GROUP_CONCAT() | 連接字符串 | GROUP_CONCAT(expr) |
| STD() / STDDEV() | 標準差 | STD(column) |
| VARIANCE() | 方差 | VARIANCE(column) |
## 二、基礎聚合函數詳解
### 2.1 COUNT() 函數
#### 2.1.1 基本用法
COUNT()函數用于計算行數或非NULL值的數量。
```sql
-- 計算表中的總行數
SELECT COUNT(*) FROM employees;
-- 計算特定列的非NULL值數量
SELECT COUNT(salary) FROM employees;
-- 計算不同值的數量
SELECT COUNT(DISTINCT department_id) FROM employees;
SUM()函數用于計算數值列的總和。
-- 計算所有員工工資總和
SELECT SUM(salary) FROM employees;
-- 計算特定條件下的總和
SELECT SUM(salary) FROM employees WHERE department_id = 10;
-- 計算表達式結果的總和
SELECT SUM(salary * commission_pct) FROM employees;
AVG()函數用于計算數值列的平均值。
-- 計算平均工資
SELECT AVG(salary) FROM employees;
-- 計算不同分組的平均值
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- 計算加權平均
SELECT SUM(salary * years_of_service)/SUM(years_of_service)
FROM employees;
MAX()和MIN()分別用于找出列中的最大值和最小值。
-- 找出最高和最低工資
SELECT MAX(salary), MIN(salary) FROM employees;
-- 找出每個部門最高工資
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
-- 可用于非數值類型
SELECT MAX(hire_date), MIN(hire_date) FROM employees;
GROUP_CONCAT()將多行數據合并為一個字符串。
-- 將部門員工姓名連接為字符串
SELECT department_id,
GROUP_CONCAT(last_name ORDER BY salary DESC SEPARATOR ', ')
FROM employees
GROUP BY department_id;
DISTINCT:去除重復值ORDER BY:指定連接順序SEPARATOR:設置分隔符(默認為逗號)-- 計算工資的標準差和方差
SELECT STD(salary), VARIANCE(salary) FROM employees;
MySQL還提供了一些位操作聚合函數:
-- 位與、位或操作
SELECT BIT_AND(flags), BIT_OR(flags) FROM permissions;
GROUP BY子句將結果集按一列或多列分組,通常與聚合函數一起使用。
-- 按部門分組計算平均工資
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- 按部門和職位分組
SELECT department_id, job_id, COUNT(*)
FROM employees
GROUP BY department_id, job_id;
WITH ROLLUP添加分組匯總行。
-- 添加匯總行
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id WITH ROLLUP;
HAVING子句用于過濾分組后的結果。
-- 篩選平均工資大于10000的部門
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 10000;
MySQL 8.0+支持窗口函數,可以在不減少行數的情況下應用聚合函數。
-- 計算各部門工資及部門平均工資
SELECT
employee_id,
salary,
AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary
FROM employees;
為GROUP BY和聚合列創建合適索引:
-- 為經常分組的列創建索引
CREATE INDEX idx_dept ON employees(department_id);
避免在WHERE子句中使用聚合函數:
-- 不好的寫法
SELECT department_id FROM employees
WHERE AVG(salary) > 10000
GROUP BY department_id;
-- 正確寫法
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
HAVING avg_salary > 10000;
使用EXPLN分析GROUP BY查詢:
EXPLN SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id;
-- 按月統計銷售總額和訂單數
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(DISTINCT order_id) AS orders,
SUM(amount) AS total_sales,
AVG(amount) AS avg_order_value
FROM sales
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;
-- 用戶活躍度分析
SELECT
user_id,
COUNT(*) AS total_actions,
COUNT(DISTINCT DATE(action_time)) AS active_days,
MIN(action_time) AS first_action,
MAX(action_time) AS last_action
FROM user_actions
GROUP BY user_id
HAVING active_days > 5;
MySQL不允許直接嵌套聚合函數,但可以使用子查詢:
-- 錯誤寫法
SELECT AVG(SUM(salary)) FROM employees GROUP BY department_id;
-- 正確寫法
SELECT AVG(dept_total)
FROM (SELECT SUM(salary) AS dept_total
FROM employees
GROUP BY department_id) AS temp;
大多數聚合函數自動忽略NULL值,COUNT(*)除外??梢允褂肅OALESCE處理:
SELECT AVG(COALESCE(salary, 0)) FROM employees;
MySQL 8.0前,GROUP BY隱式排序,8.0后不保證順序。應顯式使用ORDER BY:
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
ORDER BY department_id;
MySQL聚合函數是數據分析的強大工具,掌握它們可以高效地進行數據匯總和統計。關鍵點總結:
通過本文的學習,您應該能夠熟練運用MySQL中的各種聚合函數來解決實際的數據分析問題。
本文共計約8850字,詳細介紹了MySQL中聚合函數的各種用法、技巧和最佳實踐。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。