SQL -- GROUP BY 基本语法

bash 复制代码
SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
ORDER BY column1, column2;

主要用途

GROUP BY用于将结果集按照一个或多个列进行分组,通常与聚合函数(如COUNT、SUM、AVG、MAX、MIN)一起使用。

常用聚合函数

  • COUNT() - 计算行数
  • SUM() - 求和
  • AVG() - 平均值
  • MAX() - 最大值
  • MIN() - 最小值
  • GROUP_CONCAT() - 连接字符串(MySQL)

实际示例

1. 基本分组统计
bash 复制代码
-- 按部门统计员工数量
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department;
2. 多列分组
sql 复制代码
-- 按部门和职位统计
SELECT department, position, COUNT(*) as count
FROM employees
GROUP BY department, position;
3. 使用聚合函数
sql 复制代码
-- 按部门统计平均工资
SELECT department, 
       COUNT(*) as employee_count,
       AVG(salary) as avg_salary,
       MAX(salary) as max_salary,
       MIN(salary) as min_salary
FROM employees
GROUP BY department;
4. 带WHERE条件的分组
sql 复制代码
-- 统计2023年各月份的销售总额
SELECT MONTH(order_date) as month,
       SUM(amount) as total_sales
FROM orders
WHERE YEAR(order_date) = 2023
GROUP BY MONTH(order_date)
ORDER BY month;
5. 使用HAVING过滤分组结果
sql 复制代码
-- 找出平均工资超过50000的部门
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
6. 复杂分组示例
sql 复制代码
-- 按年份和季度统计销售数据
SELECT 
    YEAR(order_date) as year,
    QUARTER(order_date) as quarter,
    COUNT(*) as order_count,
    SUM(amount) as total_amount,
    AVG(amount) as avg_amount
FROM orders
WHERE order_date >= '2020-01-01'
GROUP BY YEAR(order_date), QUARTER(order_date)
ORDER BY year, quarter;

重要注意事项

1. SELECT子句规则
sql 复制代码
-- ✅ 正确:SELECT中的非聚合列必须在GROUP BY中
SELECT department, COUNT(*)
FROM employees
GROUP BY department;

-- ❌ 错误:name不在GROUP BY中
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;
2. WHERE vs HAVING (?)
sql 复制代码
-- WHERE:过滤行(在分组前)
SELECT department, COUNT(*)
FROM employees
WHERE salary > 30000
GROUP BY department;

-- HAVING:过滤分组(在分组后)
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
3. 分组排序
sql 复制代码
-- 按分组结果排序
SELECT department, COUNT(*) as emp_count
FROM employees
GROUP BY department
ORDER BY emp_count DESC;

实际应用场景

1. 数据分析
sql 复制代码
-- 用户行为分析:按日期统计访问量
SELECT DATE(visit_time) as date,
       COUNT(DISTINCT user_id) as unique_visitors,
       COUNT(*) as total_visits
FROM user_visits
GROUP BY DATE(visit_time)
ORDER BY date;
2. 报表生成
sql 复制代码
-- 销售报表:按产品类别统计
SELECT category,
       COUNT(*) as product_count,
       SUM(price * quantity) as total_revenue
FROM sales
GROUP BY category
ORDER BY total_revenue DESC;
3. 数据清理
sql 复制代码
-- 查找重复数据
SELECT email, COUNT(*) as count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

GROUP BY是SQL中非常重要的功能,特别适用于数据分析和报表生成。记住要正确使用WHERE和HAVING,以及确保SELECT子句中的非聚合列都在GROUP BY中。

相关推荐
YOU OU3 小时前
Redis基础常识与命令
数据库·redis·缓存
Database_Cool_5 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森6 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_6 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白7 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面7 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧7 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈8 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
HPFBoy8 小时前
log4net 数据库存日志正确配置
数据库