数据库原理与应用 第 6 章 · 第三节
课程第 6 章第三节 五个函数总分平均分最值与计数去重计数分组筛组排序并列怎么排第二排序键偏移量两种写法取前三名回头看 版式
第 6 章 数据表中的数据查询 · 第三节

聚合、分组、排序与限行

五个聚合函数,GROUP BY 与 HAVING,ORDER BY 与 LIMIT。
本 节 知 识 点
  1. 22聚合函数把一组值算成一个
  2. 23SUM 和 AVG 会跳过空值
  3. 24MAX 减 MIN 也能直接写
  4. 25COUNT 里也能写 DISTINCT
  5. 26GROUP BY 把行归成一堆堆
  6. 27HAVING 筛的是组不是行
  7. 28ORDER BY 决定行的先后
  8. 29值一样的行谁在前
  9. 30逗号后面接次排序字段
  10. 31LIMIT 的两个数各是什么
  11. 32LIMIT 还有一种等价写法
  12. 33分组排序限行连起来用
  13. 34单关系查询到此为止
22
第 6 章 · 第三节

聚合函数把一组值算成一个

五个函数,统计个数、求和、平均、最大、最小。

第 22 页课件

分清楚各管一件事

函数算出来的是
COUNT有多少个
SUM加起来多少
AVG平均多少
MAX 和 MIN最大和最小

重 点

除了 COUNT 加星号,其余的聚合函数一律跳过 NULL,不把它算进去。

23
第 6 章 · 第三节

SUM 和 AVG 会跳过空值

四门课有一门缺考,分母就只有三,不是四。

第 23 页课件

试一试同样四行,四种算法

学号 s2 的四条选课记录
cnoscore
c470.00
c557.00
c681.50
c7NULL
同样四行数据,四个函数算出来的答案不一样。

重 点

不加别名时结果的表头就是函数名本身,加上中文别名才看得懂。

上机做

上机二第 1 题 算一次总分平均分

24
第 6 章 · 第三节

MAX 减 MIN 也能直接写

聚合函数算出来的值可以继续参与四则运算。

第 24 页课件

重 点

COUNT 括号里写星号最保险,写字段名时那一列的空值会被漏掉。

练一练

学号 s2 选了 4 门课,其中一门成绩为空。COUNT(score) 返回几?
  1. A4
  2. B3
  3. C1
答案 B

COUNT 括号里写字段名时只数有值的,空的那一门不计入。

上机做

上机二第 3 题 两种 COUNT 的差别

25
第 6 章 · 第三节

COUNT 里也能写 DISTINCT

先去重再计数,问的是有几种,不是有几个。

第 25 页课件

分清楚两个问题不一样

写法回答的问题
COUNT(maj)有几个人填了专业
COUNT(DISTINCT maj)一共有几种专业

重 点

COUNT 加星号数的是行数,它不许写 DISTINCT,因为整行本来就不重复。

26
第 6 章 · 第三节

GROUP BY 把行归成一堆堆

分组之后,一堆最终只输出一行。

第 26 页课件

试一试换个分组字段试试

分组不是排序,是把行装进一个个盒子,一个盒子最后只出一行。

重 点

SELECT 后面除了聚合函数,只能出现 GROUP BY 里点过名的字段。

想一想

按课程号分组,一门没人选的课会出现在结果里吗?

27
第 6 章 · 第三节

HAVING 筛的是组不是行

WHERE 在分组前动手,HAVING 在分组后动手。

第 27 页课件

试一试两个条件站的位置

条件放在
  1. FROM sc 把 20 行原始记录取出来
  2. WHERE 一行一行地筛
  3. GROUP BY sno 剩下的行归成堆
  4. HAVING 一堆一堆地筛
两个都能写条件,但一个筛行,一个筛堆。

重 点

HAVING 必须跟在 GROUP BY 后面,WHERE 里写 COUNT 一定报错。

上机做

上机二第 5 题 WHERE 与 HAVING

28
第 6 章 · 第三节

ORDER BY 决定行的先后

默认升序,写 DESC 才是降序。

第 28 页课件

重 点

ORDER BY 排在其他子句之后,只有 LIMIT 可以再跟在它后面。

知道更多空值排在哪

MySQL 把 NULL 当最小值,升序时它排最前,降序时排最后。

想一想

不写 ASC 也不写 DESC 时,是升序还是降序?

29
第 6 章 · 第三节

值一样的行谁在前

排序字段相同的几行,机器会按主键补一个次序。

第 29 页课件

重 点

这个补出来的次序不是标准规定的,换个版本或换个表就可能变。

知道更多要稳定就写全

结果要每次都一样,就把足以区分行的字段都写进 ORDER BY。

30
第 6 章 · 第三节

逗号后面接次排序字段

主字段相同的行,再按第二个字段排。

第 30 页课件

重 点

每个排序字段各自带各自的升降序,写在自己后面,互不影响。

练一练

ORDER BY ct DESC, cn DESC 中,cn 的排序方向是什么?
  1. A升序,DESC 只管 ct
  2. B降序,每个字段各写各的
答案 B

升降序标记跟着它前面那个字段走,要降序就每个字段后面都写一遍。

上机做

上机二第 7 题 两个字段一起排

31
第 6 章 · 第三节

LIMIT 的两个数各是什么

第一个数是跳过几行,第二个数是取几行。

第 31 页课件

记牢它别记反了

  1. 前面是跳过
  2. 后面是取几行
  3. 偏移从零起

重 点

只写一个数时它是行数,偏移量默认为零,也就是从第一行开始。

打个比方

像排队报数,偏移量是从队头数过去先跳几个,行数是跳完之后接着叫几个。

32
第 6 章 · 第三节

LIMIT 还有一种等价写法

把行数写前面,偏移量跟在 OFFSET 后面。

第 32 页课件

分清楚同一件事两种写法

写法含义
LIMIT 1, 3跳过 1 行取 3 行
LIMIT 3 OFFSET 1取 3 行跳过 1 行

知道更多分页就靠它

网页翻页的公式是偏移量等于页码减一再乘以每页行数。

33
第 6 章 · 第三节

分组排序限行连起来用

先分组统计,再按统计值排序,最后取前几行。

第 33 页课件

重 点

这是取前几名的固定套路,子句顺序是分组、排序、限行,不能调。

知道更多别名能拿来排序

ORDER BY 里可以直接写 SELECT 起的中文别名,WHERE 里不行。

上机做

上机二第 8 题 查选课人数前三

34
第 6 章 · 第三节

单关系查询到此为止

一张表能问的问题问完了,接下来把表连起来。

第 34 页课件

记牢它七个子句的次序

  1. 选列在最前
  2. 条件跟着表
  3. 分组再筛组
  4. 排序最后限行

重 点

到这里为止的所有查询都只碰一张表,能问的都是这张表自己知道的事。

想一想

一张表查不出来的问题,是哪一类问题?

保山学院·人工智能教研室·曹鼎鼎