数据库中的聚合函数用于对一组值进行计算并返回单个结果。以下是关键点总结:
常见聚合函数
-
COUNT():统计行数。
-
COUNT(*)
统计所有行,包括NULL。 -
COUNT(列名)
统计非NULL值的数量。
-
-
SUM():计算数值列的总和,忽略NULL。
-
AVG():计算数值列的平均值,忽略NULL。
-
MAX()/MIN():返回列的最大/最小值,适用于数值、日期或字符串。
-
其他:如
STDDEV()
(标准差)、VARIANCE()
(方差)。
GROUP BY 子句
-
用途:按指定列分组后进行聚合。
-
语法:
SELECT 列1, 聚合函数(列2) FROM 表 GROUP BY 列1;
-
规则:SELECT中的非聚合列必须出现在
GROUP BY
中。
示例:按部门统计平均工资
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
HAVING 子句
-
用途:过滤聚合后的结果(在
GROUP BY
之后生效)。 -
与WHERE的区别:
-
WHERE
在聚合前过滤行。 -
HAVING
在聚合后过滤分组。
-
示例:筛选平均工资>5000的部门
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
关键注意事项
-
NULL处理:
-
聚合函数(如
SUM
,AVG
)忽略NULL。 -
COUNT(列名)
统计非NULL值,COUNT(*)
统计所有行。
-
-
DISTINCT:在聚合函数中处理唯一值。
sql
复制
SELECT COUNT(DISTINCT department) FROM employees;
-
排序结果:使用
ORDER BY
对聚合结果排序。SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ORDER BY avg_salary DESC;
高级分组
-
ROLLUP/CUBE:生成多层次聚合(如小计、总计)。
-- ROLLUP示例(按部门和性别组合统计) SELECT department, gender, COUNT(*) FROM employees GROUP BY ROLLUP(department, gender);
错误示例
-
错误:SELECT中包含未分组的非聚合列。
sql
复制
-- 错误:department未在GROUP BY中 SELECT department, AVG(salary) FROM employees;
-
正确:使用
GROUP BY
或聚合函数。SELECT department, AVG(salary) FROM employees GROUP BY department;
性能与最佳实践
-
在连接表时聚合:确保连接条件正确,避免数据重复。
SELECT e.department, SUM(s.amount) FROM employees e JOIN sales s ON e.id = s.employee_id GROUP BY e.department;
-
使用索引优化
GROUP BY
查询。 -
注意数据库的SQL模式(如MySQL的
ONLY_FULL_GROUP_BY
)。
聚合函数是数据分析的核心工具,合理使用GROUP BY
和HAVING
能高效完成复杂的数据汇总任务。