group by笔记

Group by 理解

1.sql语句执行过程: SELECT column1, COUNT(*) , MAX(column2) FROM TABLE  GROUP BY column1
     ①   SELECT 查询
        ②    查询结果进行 GROUP BY分组 

2.注意事项:

              ①SELECT 的字段名只能包括如下两部分:
                   (1.) column1,即分组的字段名;
                   (2.) 通过聚合函数计算的其它字段,即column2不能单独搜索名字,而只能计算column2的相关参数。
# 普通文本型问题回答 以下是为你整理的 **`GROUP BY ... HAVING` 查询模板**,适合写笔记使用,结构清晰、重点突出。 --- ## 🧩 GROUP BY + HAVING 基本语法模板 ```sql SELECT 列名 AS 别名, 聚合函数(列) AS 统计结果 FROM 表名 [WHERE 条件] -- 先过滤原始行 GROUP BY 分组列 -- 按某列分组(非聚合列必须在此列出) HAVING 分组后的筛选条件 -- 对聚合结果进行过滤 ORDER BY 排序列 ASC/DESC; -- 最终排序 ``` > 🔔 `HAVING` 是专门用于 **过滤“组”** 的条件,不能用 `WHERE` 替代对聚合值的判断。 --- ## ✅ 执行顺序(非常重要!) | 步骤 | 子句 | 说明 | |------|------|------| | 1 | `FROM` | 确定数据来源表 | | 2 | `WHERE` | 过滤单条记录(在分组前) | | 3 | `GROUP BY` | 将数据按指定列分组 | | 4 | `HAVING` | 对每组数据进行条件筛选 | | 5 | `SELECT` | 选择要输出的列和聚合函数 | | 6 | `ORDER BY` | 对最终结果排序 | 📌 记住口诀: **“先 from 找表,再 where 筛行;group 分组,having 筛组;select 输出,order 排序。”** --- ## 📚 实例:统计每个专业的平均成绩,并只显示高于 80 的专业 ```sql SELECT major.mname AS 专业, AVG(sc.grade) AS 平均成绩 FROM major LEFT JOIN stu ON major.mno = stu.mno LEFT JOIN sc ON stu.sno = sc.sno GROUP BY major.mno, major.mname HAVING AVG(sc.grade) > 80 ORDER BY 平均成绩 DESC; ``` ### 💡 解析: - `GROUP BY major.mno, mname` → 每个专业一组 - `AVG(sc.grade)` → 计算每组的平均分 - `HAVING AVG(sc.grade) > 80` → 只保留平均分 > 80 的专业 - 使用了 `mno` 防止同名专业混淆 --- ## ⚠️ 常见错误与注意事项 | 错误写法 | 正确做法 | 说明 | |--------|---------|------| | `WHERE AVG(...) > 80` | 改为 `HAVING AVG(...) > 80` | `WHERE` 不能用于聚合函数 | | `SELECT mname, sno` 但 `GROUP BY mname` | 所有非聚合列都需加入 `GROUP BY` | SQL 规范要求 | | `HAVING` 写在 `GROUP BY` 前面 | 必须放在 `GROUP BY` 之后 | 语法错误 | --- ## 🎯 HAVING 和 WHERE 的区别(表格对比) | 对比项 | `WHERE` | `HAVING` | |-------|---------|----------| | 作用对象 | 单条记录 | 分组后的组 | | 是否能用聚合函数 | ❌ 不能 | ✅ 能(如 `AVG`, `COUNT`) | | 出现位置 | `GROUP BY` 前 | `GROUP BY` 后 | | 示例 | `WHERE grade >= 60` | `HAVING AVG(grade) > 75` | --- ## 📝 笔记小结(可直接抄录) > ✅ `GROUP BY`:把数据按某一列分类,每类计算一个聚合值(如平均、总数)。 > ✅ `HAVING`:用来筛选“哪些组”可以保留,支持聚合函数判断。 > ✅ 必须记住:**`WHERE` 筛行,`HAVING` 筛组**。 > ✅ 安全写法:将主键或唯一标识包含在 `GROUP BY` 中,防止合并错误。 --- ### ✅ 推荐记忆口诀: > **分组靠 GROUP BY, > 筛组就得 HAVING 来; > WHERE 只管单条路, > 聚合条件它不许碰!** --- 这个模板可以直接作为学习笔记保存,适用于考试复习或日常开发参考。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值