聚合查询
In this section, you will learn below keywords of MySQL:
- AVG
- COUNT
- MAX
- MIN
- SUM
- ROUND
Example table: user_profile
| id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
|---|---|---|---|---|---|---|---|---|
| 1 | 2138 | male | 21 | Peking University | 3.4 | 7 | 2 | 12 |
| 2 | 3214 | male | Fudan University | 4 | 15 | 5 | 25 | |
| 3 | 6543 | female | 20 | Peking University | 3.2 | 12 | 3 | 30 |
| 4 | 2315 | female | 23 | Zhejiang University | 3.6 | 5 | 1 | 2 |
| 5 | 5432 | male | 25 | Shandong University | 3.8 | 20 | 15 | 70 |
| 6 | 2131 | male | 28 | Shandong University | 3.3 | 15 | 7 | 13 |
| 7 | 4321 | male | 28 | Fudan University | 3.6 | 9 | 6 | 52 |
note
- active_days_within_30: 30 天内活跃天数
- question_cnt: 发帖数量
- answer_cnt: 回答数量
聚合函数
有时候并不需要返回实际表中的数据,而只是对数据进行总结。MySQL 提供一些函数可以对获取的数据进行分析和报告,下面我们来介绍一下常见的聚合函数。
AVG
AVG() 可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。下面的例子返回的是 user_profile 表中所有用户的平均 gpa 情况 。
SELECT AVG(gpa) FROM user_profile;
| AVG(gpa) |
|---|
| 3.557142836706979 |
COUNT
COUNT() 函数为计数函数,主要有两种使用方式:
- 使用
COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。 - 使用
COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
这两点该怎么理解呢,比如对于下面的数据表,如果用语法 1,那么得到的结果会是 7,因为表中一共有 7 行数据
Syntax 1:
SELECT COUNT(*) AS num_cnt FROM user_profile;
| num_cnt |
|---|
| 7 |
但如果我们对 age 列进行 COUNT,因为该列中存在一行为空值,在计数中不会被算入,语法 2 得到的结果会是 6
Syntax 2:
SELECT COUNT(age) AS num_cnt FROM user_profile;
| num_cnt |
|---|
| 6 |
MAX
MAX() 返回指定列中的最大值。
SELECT MAX(age) AS max_age FROM user_profile;
| max_age |
|---|
| 28 |
MIN
MIN() 的功能正好与 MAX() 功能相反,它返回指定列的最小值,如下所示:
SELECT MIN(age) AS min_age FROM user_profile;
| min_age |
|---|
| 20 |
SUM
SUM() 用来返回指定列值的和(总计)。如下所示函数返回了 age 列所有用户年纪的总和
SELECT SUM(age) AS sum_age FROM user_profile;
| sum_age |
|---|
| 145 |
ROUND
在一些聚合运算中,容易出现结果为非整数的情况,这时候如果想要限定结果返回的小数位数就可以使用 SQL 中内置的 ROUND 函数,语法格式为:
ROUND(value, n)
其中 value 代表想要限制小数位数的字段,n 代表想要限制的小数位数。下列语句就代表求 age 列的均值,并保留一位小数。
SELECT ROUND(AVG(age), 1) AS avg_age FROM user_profile;
| avg_age |
|---|
| 24.2 |