1. 聚集函数与GROUP BY的本质作用
在数据处理和分析中,我们经常需要对数据进行汇总统计。想象一下超市的销售数据——每天有成千上万条交易记录,但管理层更关心的是每个品类的总销售额、平均单价或最畅销商品。这正是聚集函数和GROUP BY的用武之地。
聚集函数(Aggregate Functions)是SQL中用于对一组值执行计算并返回单一值的函数。它们就像数据处理的"统计员",能够快速完成以下工作:
- COUNT():统计行数
- SUM():计算总和
- AVG():计算平均值
- MAX()/MIN():找出最大/最小值
- GROUP_CONCAT():将多行合并为字符串(MySQL特有)
而GROUP BY子句则是这些统计员的"分组依据",它告诉数据库:"请先按照某个字段的值将数据分组,再对每个组分别应用聚集函数"。没有GROUP BY的聚集函数会对整个表进行计算,有了GROUP BY就能实现更细粒度的统计分析。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心聚集函数详解与实战
2.1 COUNT()函数的正确使用姿势
COUNT()可能是最常用的聚集函数,但它的几种变体常让人困惑:
sql复制-- 统计总记录数(包含NULL值)
SELECT COUNT(*) FROM sales;
-- 统计某列非NULL值的数量
SELECT COUNT(product_id) FROM sales;
-- 统计不重复值的数量
SELECT COUNT(DISTINCT category) FROM products;
注意:COUNT(1)和COUNT(*)在大多数数据库中性能几乎相同,但COUNT(列名)会跳过NULL值,这是新手常踩的坑。
实际案例:统计每月活跃用户数
sql复制SELECT
DATE_FORMAT(login_time, '%Y-%m') AS month,
COUNT(DISTINCT user_id) AS active_users
FROM user_logins
GROUP BY DATE_FORMAT(login_time, '%Y-%m');
2.2 SUM()与AVG()的数值处理陷阱
处理金融数据时,SUM()和AVG()需要特别注意精度问题:
sql复制-- 计算订单总金额(注意浮点数精度)
SELECT
order_id,
ROUND(SUM(quantity * unit_price), 2) AS total_amount
FROM order_items
GROUP BY order_id;
-- 计算平均评分(处理NULL值)
SELECT
product_id,
AVG(COALESCE(rating, 0)) AS avg_rating
-- 假设NULL表示0分
FROM reviews
GROUP BY product_id;
经验:对于货币计算,建议在数据库中使用DECIMAL类型而非FLOAT,避免二进制浮点数的精度问题。
2.3 极值函数的特殊应用场景
MAX()/MIN()不仅适用于数值,还能处理日期和字符串:
sql复制-- 找出每个用户的最近登录时间
SELECT
user_id,
MAX(login_time) AS last_login
FROM user_logins
GROUP BY user_id;
-- 获取按字母排序的第一个产品名称
SELECT
category,
MIN(product_name) AS first_product
FROM products
GROUP BY category;
3. GROUP BY的深度解析
3.1 单字段分组的基础用法
最基本的GROUP BY形式是按单个字段分组:
sql复制-- 统计每个部门的员工数
SELECT
department_id,
COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
这里有一个重要规则:SELECT子句中除了聚集函数,所有列都必须出现在GROUP BY中。违反这一规则会导致语法错误。
3.2 多字段分组实现多维分析
通过多个字段分组,可以实现类似数据透视表的效果:
sql复制-- 统计每个部门每个职位的平均薪资
