MySQL 视频课 · 50 集 / DQL 进阶:分组、排序、分页、综合案例、执行顺序 / P18

第 18 集 / 共 50 · DQL 进阶:分组、排序、分页、综合案例、执行顺序 · 视频 p=18 · 时长 10:18

P18 18. 基础-SQL-DQL-分组查询

讲义 2.6.5 分组查询 p46–47

按主题对应,非逐句切分

来源与核对说明

以同版讲义的公开镜像核对章节与页码(镜像非官方出品);非逐字稿,示例为原创补充。

本页是学习笔记,不等同于视频逐字稿。原声字幕未取得(匿名接口字幕轨为空且需登录,未使用任何账号),也没有逐句讲解记录;讲义只按节与页码对应,切点未逐句确证。

讲义索引:p46–47 · 2.6.5 分组查询 · 切点 notexact

讲义是第三方公开镜像(95 页 PDF),不是官方原件;这里只用它核对章节顺序与页码,不转载正文。

完整来源说明与变更记录 →

看视频,对照阅读:在新标签打开原视频(p=18)

分组查询把“逐行看”换成“按类看”。本集重点是 GROUP BY 配聚合函数,再用 HAVING 筛组。

复习模式:快速跳知识点(详解在下方各节)

复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。

一句话理解

把行按某一列的值分成几堆,再对每一堆算一个汇总数——这就是分组查询。

按这 4 步做

  1. 先用 WHERE 把不要的行筛掉,这时还不知道最后会分几组。比如写 WHERE age < 30,先只留下符合条件的行。
  2. 再用 GROUP BY dept_id 按部门把这些行分堆,每个不同的 dept_id 值成为一堆。 分组列可以写多个(如 GROUP BY gender, dept_id):先按第一列分,相同再按第二列分。
  3. SELECT 里只写分组列和聚合函数,例如 COUNT(*)、AVG(salary),数据库会对每一堆各算一个值。
  4. 对“堆”的条件写在 HAVING 里,比如只保留人数 ≥ 2 的组;它和 WHERE 的位置不同,作用对象也不同。

小例

先准备本集练习数据:p18.sql · 练习库说明

SQL 示例
SELECT dept_id, COUNT(*) AS 人数, ROUND(AVG(salary), 0) AS 平均薪资
FROM employee
WHERE age < 30
GROUP BY dept_id
HAVING COUNT(*) >= 2;

【原创演示】依赖前面给出的 employee 四行练习数据(小林 22/dept1/8000,小周 25/dept1/10000,小陈 30/dept2/12000,小李 21/NULL/NULL),不用额外建表。WHERE 先去掉 30 岁的小陈;剩下小林、小周在部门 1,小李的 dept_id 是 NULL,自成一堆。HAVING 只留人数 ≥ 2 的堆,于是只剩部门 1:人数 2,平均薪资 9000。结果一行:1、2、9000。

易错点

30 秒速记

WHERE 筛行 → GROUP BY 分堆 → 聚合函数每堆一值 → HAVING 筛堆;非分组列不进 SELECT。

自测(3 题,先答再展开)

自测 1:为什么 HAVING COUNT(*) >= 2 不能改写成 WHERE COUNT(*) >= 2?

WHERE 在分组之前逐行判断,那时还没有“组”和计数结果;COUNT(*) 是分组后的汇总值,只能由 HAVING 判断。

自测 2:小李 dept_id 为 NULL,按 dept_id 分组后他会消失吗?

不会。GROUP BY 把 NULL 当成一个独立的分组值,他单独成一组;只有写成 COUNT(dept_id) 时这一组的计数才会是 0。

自测 3:例子里的 ROUND(AVG(salary),0) 为什么放在 SELECT 而不是 WHERE?

它是每堆算出来的汇总值,属于分组之后才存在的结果;放进 WHERE 时组还没形成,SQL 算不出来。

材料与来源

展开材料出处、讲义页码与证据等级
材料类型 / 位置支持了什么
P18 原视频页(BV1Kr4y1i7ru)平台视频页 · P18;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend标题“分组查询”;t20 帧的 Workbench 画面可见本集演示注释。
MySQL 8.0 Reference:GROUP BY 处理与 ONLY_FULL_GROUP_BY官方文档用于核对“非分组列 + 聚合函数”在默认 sql_mode 下的行为,未逐字引用。
MySQL 8.0 Reference:SELECT 语句官方文档核对 WHERE/GROUP BY/HAVING 的子句位置。

按 P18 标题“分组查询”和 9 张采样静帧整理:t20 帧的 Workbench 画面里能看到本集演示注释——按性别分组统计人数、按性别统计平均年龄、先筛年龄<45 再按工作地址分组并要求数量≥3,说明本集讲的是 GROUP BY 与 HAVING 的组合。无字幕,讲师原话与逐条演示结果未核实;正文小表与数字是原创练习数据,不是课堂 emp 表。

讲义对照:讲义 2.6.5 分组查询 · p46–47(公开镜像;按主题对应,切点 notexact)

  • 画面静帧 9 帧,采样点 0:12–10:05 / 全片 10:18(只用于确认画面主题,不作内容边界)
  • 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号

等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。

下载本集 Markdown