第二阶段-第二章—8天Python从入门到精通【itheima】-134节(SQL——DQL——分组聚合)
目录
134节——DQL:分组聚合
1.学习目标
2.分组聚合
3.论MySQL 中 GROUP BY 和 WHERE 的异同
MySQL 中 GROUP BY 和 WHERE 的异同:
一、相同点:都是 “筛数据” 的工具
二、不同点:筛的时机和对象完全不一样
1. 作用时机不同:先筛行,再分组
2. 作用对象不同:筛单行 vs 筛分组
3. 不能混搭的 “规矩”
三、一句话总结
4.小节总结
编辑
好了,又一篇博客和代码写完了,励志一下吧,下一小节等等继续:
134节——DQL:分组聚合
1.学习目标
1.掌握DQL的group by进行分组聚合查询
2.分组聚合
代码实例:
use student;select * from student;-- 查询男女生的各自的平均年龄 select avg(age),gender from student group by gender;-- 错误的查询示例:会爆出error!!! /*因为:查询的性别分组的avg(age),这个avg(age)是每个性别组的平均值, 如果加上name这个具体字段,那这个avg(age)属于谁?这样就有歧义了*/ -- select avg(age),gender,name from student group by gender;-- 这是对于普通字段来说: -- 这是SQL的限制:group by中出现了谁【普通的字段】,select中才能出现写谁【普通的字段】;而聚合函数不属于普通的字段,因此不包括/*对于聚合函数的count来说【按group by gender后】,她本来就是计数的功能, 分完组进行各自的性别计数,因此count(name),count(age),count(gender),count(id),count(*),这些功能都是一样的*/ -- 示例:【一个SQL语句里面是可以写多个聚合函数的】 select gender,sum(age),avg(age),MIN(age),MAX(age),COUNT(*) from student group by gender;
3.论MySQL 中 GROUP BY 和 WHERE 的异同
MySQL 中 GROUP BY 和 WHERE 的异同:
一、相同点:都是 “筛数据” 的工具
不管是
WHERE
还是GROUP BY
,本质上都是为了从一堆数据中 “挑出我们想要的”,避免查出来的结果乱七八糟。二、不同点:筛的时机和对象完全不一样
用一个例子先打底:假设我们有一张
student
表,存了 “班级”“姓名”“年龄” 三列数据,现在想查 “每个班级中,年龄大于 18 岁的学生有多少人”。1. 作用时机不同:先筛行,再分组
WHERE:在分组之前干活。
比如 “年龄> 18” 这个条件,WHERE
会先把所有年龄≤18 的学生直接排除,剩下的才会参与后续的分组。
就像筛沙子:先把小石子(不符合条件的行)筛掉,剩下的沙子再分堆。GROUP BY:在分组之后干活。
它的作用是把WHERE
筛剩下的行,按某个字段(比如 “班级”)分成几堆,每一堆就是一个 “组”。
比如按 “班级” 分组后,会得到 “一班”“二班”“三班” 三个组,每个组里都是年龄 > 18 的学生。2. 作用对象不同:筛单行 vs 筛分组
WHERE:针对 “单个行” 筛。
条件都是判断单行数据是否符合要求,比如 “年龄> 18”“性别 =' 男 '”,每个条件只看单独的一行,不管其他行。GROUP BY:针对 “一组行” 操作。
分组后,每组是多个行的集合,通常会配合聚合函数(COUNT
“算数量”、SUM
“求和” 等)使用。
比如 “每个班级的学生数量”,就是用GROUP BY 班级
把行分成组,再用COUNT(*)
计算每组有多少行。3. 不能混搭的 “规矩”
WHERE 后面不能用聚合函数:
比如不能写WHERE COUNT(*)>2
(因为WHERE
在分组前执行,此时还没有 “组”,没法算COUNT(*)
)。GROUP BY 必须和聚合函数搭配才有用:
单独写GROUP BY 班级
没意义,必须加上COUNT(*)
“算每个班的人数”、AVG(年龄)
“算每个班的平均年龄” 等,才能体现分组的价值。三、一句话总结
WHERE
:先把 “不合格的单个行” 踢出去,只留合格的行。GROUP BY
:把合格的行按规则分成 “组”,再对每组做统计(比如算数量、求和)。用例子串起来就是:
-- 查每个班级中,年龄>18的学生数量 SELECT 班级, COUNT(*) AS 学生数量 FROM student WHERE 年龄>18 -- 先筛掉年龄≤18的行 GROUP BY 班级; -- 再按班级分组,算每组的人数
4.小节总结
group by中出现了哪个字段,select中才能出现该字段。
【以上是对于普通字段来说,对于应用了聚合函数的字段不生效】
好了,又一篇博客和代码写完了,励志一下吧,下一小节等等继续:
Patrick:
你觉得自己写的是 “人人皆知的 shit”?那我问你:你第一次学会走路时,摇摇晃晃迈出的步子,在别人眼里是不是 “人人都会的小事”?但对你来说,那是从爬到走的里程碑。
你现在敲的每一行 SQL、写的每段总结,就像当年学走路的步子。那些 “人人皆知” 的基础,在你这里有不一样的重量 —— 它们是你忍着身体的不适,一点点啃下来的;是你对着报错信息反复调试,才弄明白的 “GROUP BY 和 WHERE 的区别”。别人眼里的 “常识”,在你这里是 “和自己较劲后的战利品”,这本身就值得被记录。
中二?偏执?我倒觉得,能对着基础知识点死磕、能为自己写的东西沾沾自喜,这是最珍贵的 “初心”。多少人学东西半途而废,就是因为觉得 “太简单不值得记录”,结果连 “简单” 都没吃透。你把这些 “小事” 记下来,不是炫耀,是在给自己的成长盖戳 —— 就像登山时在石头上画的记号,回头看时,才知道自己爬了多高。
你以为 “了不起的大事” 是突然降临的?不是。是无数个 “觉得自己写了 shit 还坚持写” 的夜晚,攒出来的。你对抗身体的不适、对抗自我怀疑,还能坐在那里敲代码、写总结,这本身就比 “写出惊天动地的内容” 更了不起。
别管别人怎么看。你的博客不是写给 “人人” 看的,是写给 “今天的 Patrick” 和 “明天的 Patrick” 的。今天的你觉得 “沾沾自喜” 很傻,明天的你会谢谢今天这个 “傻” 得坚持记录的自己。
继续写吧。哪怕是基础到不能再基础的总结,哪怕是自己跟自己较劲的碎碎念 —— 这些都是你活着、在往前挪、没被打倒的证据。这样的证据,越多越好。
一个看你把 “小事” 走成 “长路” 的朋友