聚合函数把一组值算成一个
五个函数,统计个数、求和、平均、最大、最小。

分清楚各管一件事
| 函数 | 算出来的是 |
|---|---|
| COUNT | 有多少个 |
| SUM | 加起来多少 |
| AVG | 平均多少 |
| MAX 和 MIN | 最大和最小 |
重 点
除了 COUNT 加星号,其余的聚合函数一律跳过 NULL,不把它算进去。
五个函数,统计个数、求和、平均、最大、最小。

| 函数 | 算出来的是 |
|---|---|
| COUNT | 有多少个 |
| SUM | 加起来多少 |
| AVG | 平均多少 |
| MAX 和 MIN | 最大和最小 |
除了 COUNT 加星号,其余的聚合函数一律跳过 NULL,不把它算进去。
四门课有一门缺考,分母就只有三,不是四。

| cno | score |
|---|---|
| c4 | 70.00 |
| c5 | 57.00 |
| c6 | 81.50 |
| c7 | NULL |
不加别名时结果的表头就是函数名本身,加上中文别名才看得懂。
聚合函数算出来的值可以继续参与四则运算。

COUNT 括号里写星号最保险,写字段名时那一列的空值会被漏掉。
COUNT 括号里写字段名时只数有值的,空的那一门不计入。
先去重再计数,问的是有几种,不是有几个。

| 写法 | 回答的问题 |
|---|---|
| COUNT(maj) | 有几个人填了专业 |
| COUNT(DISTINCT maj) | 一共有几种专业 |
COUNT 加星号数的是行数,它不许写 DISTINCT,因为整行本来就不重复。
分组之后,一堆最终只输出一行。

SELECT 后面除了聚合函数,只能出现 GROUP BY 里点过名的字段。
按课程号分组,一门没人选的课会出现在结果里吗?
WHERE 在分组前动手,HAVING 在分组后动手。

FROM sc 把 20 行原始记录取出来WHERE 一行一行地筛GROUP BY sno 剩下的行归成堆HAVING 一堆一堆地筛HAVING 必须跟在 GROUP BY 后面,WHERE 里写 COUNT 一定报错。
默认升序,写 DESC 才是降序。

ORDER BY 排在其他子句之后,只有 LIMIT 可以再跟在它后面。
MySQL 把 NULL 当最小值,升序时它排最前,降序时排最后。
不写 ASC 也不写 DESC 时,是升序还是降序?
排序字段相同的几行,机器会按主键补一个次序。

这个补出来的次序不是标准规定的,换个版本或换个表就可能变。
结果要每次都一样,就把足以区分行的字段都写进 ORDER BY。
主字段相同的行,再按第二个字段排。

每个排序字段各自带各自的升降序,写在自己后面,互不影响。
升降序标记跟着它前面那个字段走,要降序就每个字段后面都写一遍。
第一个数是跳过几行,第二个数是取几行。

只写一个数时它是行数,偏移量默认为零,也就是从第一行开始。
像排队报数,偏移量是从队头数过去先跳几个,行数是跳完之后接着叫几个。
把行数写前面,偏移量跟在 OFFSET 后面。

| 写法 | 含义 |
|---|---|
| LIMIT 1, 3 | 跳过 1 行取 3 行 |
| LIMIT 3 OFFSET 1 | 取 3 行跳过 1 行 |
网页翻页的公式是偏移量等于页码减一再乘以每页行数。
先分组统计,再按统计值排序,最后取前几行。

这是取前几名的固定套路,子句顺序是分组、排序、限行,不能调。
ORDER BY 里可以直接写 SELECT 起的中文别名,WHERE 里不行。
一张表能问的问题问完了,接下来把表连起来。

到这里为止的所有查询都只碰一张表,能问的都是这张表自己知道的事。
一张表查不出来的问题,是哪一类问题?