# 数据统计
# 案例数据
# 算术运算
对于 select 语句来说,我们可以在 select 子句中使用算术运算。MySQL 的常用算术运算符有 7 个,如表所示。
运算符 | 说明 | 用法 |
---|---|---|
+ | 加 | a + b |
- | 减 | a – b |
* | 乘 | a * b |
/ | 除 | a / b |
% | 取余 | a % b |
div | 取整,即取商的整数部分 | a div b |
- | 取负数 | -a |
示例:
select name, price + 10
from fruit;
2
# 聚合函数
聚合函数,也叫作“统计函数”。所谓的聚合函数,指的是对一列值进行计算,然后最终会返回单个值。所以聚合函数还可以叫作“组函数”。
在实际开发中,有时需要对某一列的数据进行求和、求平均值等操作,此时就要用到聚合函数。MySQL
的常用聚合函数有 5 个,如下表所示。
函数 | 说明 |
---|---|
sum() | 求和 |
avg() | 求平均值 |
max() | 求最大值 |
min() | 求最小值 |
count() | 获取行数 |
count(*):计算表的行数,不会忽略值为 null 的行,count(*) 表示包含所有的列。
# 示例
sum() 求和:
select sum(类型 列名)
from 表名;
2
“类型”的取值有两种:all 和 distinct,默认值是 all。如果是 all,则计算所有值的和;如果是 distinct,则计算非重复值的和。
sum() 函数只能用于对数值列的数据求和,并且计算时会忽略 null 值。
select sum(price)
from fruit;
2
# 特别注意
对于聚合函数来说,需要特别注意以下两点。
- 聚合函数一般用于 select 子句,而不能用于 where 子句,准确的说法是:聚合函数只能用于 select、order by、having 这 3 种子句,而不能用于 where、group by 等其他子句。
- sum()、avg()、max()、min() 这 4 个聚合函数只适用于数值类型的列。如果指定列的数据不是数值类型,就可能会报错。
已下是个错误示例:
select *
from fruit
where price > avg(price);
2
3
# 分组子句:group by
分组统计,指的是根据“某些条件”来将数据拆分为若干组。例如有一个学生信息表,我们可以根据类型、性别、家乡等对学生进行分组,然后统计每个组有多少人、男女各为多少人等。
# group by 子句
select 列名
from 表名
group by 列名;
2
3
当你使用
GROUP BY
子句时,SELECT列表中除了聚合函数(如COUNT(*)
)之外的所有字段都必须包含在GROUP BY
子句中
示例
select type as 类型,
season as 季节,
count(*) as 行数
from fruit
group by type, season;
2
3
4
5
group by 子句的书写顺序是有严格要求的:group by 子句一定要写在 where 子句以及 from 子句的后面。如果没有按照下面的顺序书写,那么在执行 SQL 代码时会报错。
select 子句 → from 子句 → where 子句 → group by 子句
1
在实际开发中,group by 子句经常是和聚合函数,一起使用的。**我们一说起 group by 子句,就应该把它和聚合函数联系起来。**这是 group by 子句非常重要的一个特点,小伙伴们一定要记住。
select type as 类型,
max(price) as 最高售价,
min(price) as 最低售价,
avg(price) as 平均售价
from fruit
group by type;
2
3
4
5
6
# group_concat() 函数
在 MySQL
中,可以使用 group_concat()
函数来查看不同分组的取值情况。
select type as 类型,
group_concat(name) as 取值
from fruit
group by type;
2
3
4
# 指定条件:having
在 MySQL
中,可以使用 having
子句来给分组指定条件,也就是给 group by
子句的结果指定条件。
having
子句不能单独使用,而必须结合 group by 子句使用,并且 having
子句必须位于 group by
子句之后。实际上,select
语句的各个子句必须遵循下面的书写顺序。
select 子句 → from 子句 → where 子句 → group by 子句 → having 子句
示例,行数为 3 的分组
select type as 类型,
count(*) as 行数
from fruit
group by type
having count(*) = 3;
2
3
4
5
# 子句顺序
select 语句主要包含 7 种子句, 每条语句都是由不同的子句组合而成的,如下表所示:
子句 | 说明 |
---|---|
select | 查询哪些列 |
from | 从哪个表查询 |
where | 查询条件 |
group by | 分组 |
having | 分组条件 |
order by | 排序 |
limit | 限制行数 |
前面我们了解到,各个子句的书写是需要遵循一定顺序的。select 语句中的各个子句需要严格遵循下面的书写顺序。
select → from → where → group by → having → order by → limit