跳转到内容

SQL分组查询(GROUP BY)

来自代码酷
Admin留言 | 贡献2025年5月12日 (一) 00:20的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

SQL分组查询(GROUP BY)[编辑 | 编辑源代码]

SQL分组查询是一种强大的数据聚合技术,它允许用户将结果集按一个或多个列分组,并对每个组应用聚合函数(如COUNT、SUM、AVG等)。这是数据分析、报表生成和业务智能中的核心操作。

基本语法[编辑 | 编辑源代码]

分组查询的核心是GROUP BY子句,其基本语法如下:

SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1;

关键概念[编辑 | 编辑源代码]

聚合函数[编辑 | 编辑源代码]

常用聚合函数包括:

  • COUNT() - 计数
  • SUM() - 求和
  • AVG() - 平均值
  • MAX() - 最大值
  • MIN() - 最小值

HAVING子句[编辑 | 编辑源代码]

与WHERE类似,但用于过滤分组后的结果:

SELECT column1, COUNT(column2)
FROM table
GROUP BY column1
HAVING COUNT(column2) > 5;

详细示例[编辑 | 编辑源代码]

示例1:基本分组[编辑 | 编辑源代码]

假设有sales表:

sales表数据
sale_id product category amount sale_date
1 Laptop Electronics 1200 2023-01-15
2 Phone Electronics 800 2023-01-20
3 Desk Furniture 350 2023-02-05

计算每个类别的总销售额:

SELECT category, SUM(amount) as total_sales
FROM sales
GROUP BY category;

输出结果:

category total_sales
Electronics 2000
Furniture 350

示例2:多列分组[编辑 | 编辑源代码]

按类别和月份分组:

SELECT 
    category, 
    EXTRACT(MONTH FROM sale_date) as month,
    SUM(amount) as monthly_sales
FROM sales
GROUP BY category, EXTRACT(MONTH FROM sale_date);

高级用法[编辑 | 编辑源代码]

分组集(GROUPING SETS)[编辑 | 编辑源代码]

允许在单个查询中指定多个分组:

SELECT category, product, SUM(amount)
FROM sales
GROUP BY GROUPING SETS (
    (category, product),
    (category),
    ()
);

ROLLUP与CUBE[编辑 | 编辑源代码]

  • ROLLUP生成层次化的小计
  • CUBE生成所有可能组合的小计

flowchart TD A[原始数据] --> B[GROUP BY] B --> C[按category分组] B --> D[按product分组] B --> E[不分组]

实际应用场景[编辑 | 编辑源代码]

场景1:电商销售分析[编辑 | 编辑源代码]

分析各产品类别的月销售额趋势,识别畅销品类。

场景2:用户行为分析[编辑 | 编辑源代码]

统计不同用户群体的活动频率,用于用户分群。

性能考虑[编辑 | 编辑源代码]

  • 为GROUP BY列创建索引
  • 避免在大表上使用复杂分组
  • 考虑使用物化视图存储预聚合结果

常见错误[编辑 | 编辑源代码]

1. 在SELECT中包含非聚合列但未在GROUP BY中列出

   -- 错误示例
   SELECT product, category, SUM(amount)
   FROM sales
   GROUP BY category;

2. 混淆WHERE和HAVING的使用时机

数学基础[编辑 | 编辑源代码]

分组操作本质上是将关系R划分成等价类: G={[x]|xR} 其中[x]={y|yR,yx}

练习[编辑 | 编辑源代码]

尝试编写查询: 1. 计算每个月的销售总额 2. 找出销售额超过1000的产品类别 3. 计算每个类别中产品的平均售价

总结[编辑 | 编辑源代码]

GROUP BY是SQL中最强大的数据分析工具之一,掌握它能显著提升数据处理能力。从简单分组到高级OLAP操作,理解这一概念对任何使用数据库的人员都至关重要。