3-1 group by 详细用法教程
在 SQL 中,GROUP BY 子句用于将查询结果按照一个或多个列进行分组,
通常与聚合函数(如 SUM、COUNT、AVG 等)结合使用,以汇总每个组的数据。
一、基本语法
SELECT
column1, -- 必须出现在GROUP BY中或使用聚合函数
column2, -- 必须出现在GROUP BY中或使用聚合函数
aggregate_function(column3) -- 聚合函数(如SUM、COUNT等)
FROM
table_name
WHERE
condition -- 可选过滤条件
GROUP BY
column1, column2 -- 按这些列分组
ORDER BY
二、核心概念
2. 常用聚合函数
三、示例 1:按单列分组
需求:统计每个客户的订单总数和总金额
SELECT
customer_id,
COUNT(*) AS order_count, -- 每个客户的订单数
SUM(amount) AS total_amount -- 每个客户的总金额
FROM
orders
GROUP BY
结果:
四、示例 2:按多列分组
需求:统计每个客户、每种状态的订单数
SELECT
customer_id,
status,
COUNT(*) AS order_count
FROM
orders
GROUP BY
结果:
五、示例 3:结合 WHERE 子句过滤
需求:统计金额大于 100 的订单,按客户分组
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM
orders
WHERE
amount > 100 -- 先过滤金额大于100的订单
GROUP BY
六、示例 4:使用 HAVING 过滤分组结果
需求:找出总订单金额超过 200 的客户
SELECT
customer_id,
SUM(amount) AS total_amount
FROM
orders
GROUP BY
customer_id
HAVING
关键区别:
七、示例 5:使用聚合函数的嵌套
需求:计算每个客户的平均订单金额,并保留两位小数
SELECT
customer_id,
ROUND(AVG(amount), 2) AS avg_amount -- 计算平均值并四舍五入
FROM
orders
GROUP BY
八、示例 6:分组连接字符串(MySQL)假设
需求:列出每个类别下的所有产品
SELECT
category,
GROUP_CONCAT(product_name SEPARATOR ', ') AS products
FROM
products
GROUP BY
结果:
九、注意事项
SELECT
customer_id,
status, -- 必须出现在GROUP BY中
COUNT(*)
FROM
orders
GROUP BY
SELECT
column_with_null,
COUNT(*)
FROM
table
GROUP BY
十、常见错误
SELECT
customer_id,
SUM(amount) -- 错误!缺少GROUP BY子句
FROM
SELECT
customer_id,
status, -- 未包含在GROUP BY中
SUM(amount)
FROM
orders
GROUP BY
十一、最佳实践
SELECT
customer_id AS customer,
COUNT(*) AS orders
FROM
orders
GROUP BY
SELECT
customer_id,
SUM(amount) AS total
FROM
orders
GROUP BY
customer_id
ORDER BY
十二、进阶用法:ROLLUP 和 CUBE
1. ROLLUP
SELECT
customer_id,
status,
SUM(amount)
FROM
orders
GROUP BY
2. CUBE
SELECT
customer_id,
status,
SUM(amount)
FROM
orders
GROUP BY
通过 GROUP BY,你可以高效地对数据进行分组和聚合,提取有价值的统计信息。合理使用聚合函数和过滤条件,能让你的查询更加灵活和强大。