【MySQL聚合查询】轻松实现数据统计

1、聚合查询

聚合查询:行和行之间的运算

1.1 聚合函数

常见的聚合函数:

  • count:数量

  • sum:求和

  • avg:求平均值

  • max:最大值

  • min:最小值

1.2 聚合函数的使用

1.2.1 count 函数

现在有一个 class 表:

现在我们就用 count 来统计 class 表中有多少个班级

-- select count(id) from class;
select count(*) from class;
+----------+
| count(*) |
+----------+
|        3 |
+----------+

1.2.2 sum 函数

现在有一个 score 表:

现在我们就用 sum函数来求 language 成绩的总和

select sum(language) from score;
+---------------+
| sum(language) |
+---------------+
|        283.50 |
+---------------+

1.2.3 avg 函数

现在有一个 score 表:

现在我们就用 avg函数来求 language 成绩的平均值

select avg(language) from score;
+---------------+
| avg(language) |
+---------------+
|     94.500000 |
+---------------+

1.2.4 max 函数

现在有一个 score 表:

现在我们就用 max 函数来求 language 成绩中的最大值

select max(language) from score;
+---------------+
| max(language) |
+---------------+
|         97.80 |
+---------------+

1.2.5 min 函数

现在有一个 score 表:

现在我们就用 min 函数来求 language 成绩中的最小值

select min(language) from score;
+---------------+
| min(language) |
+---------------+
|         89.50 |
+---------------+

1.3 group by 子句

1.3.1 group by 的使用

group by 可以对表中的行进行分组查询

不用group by 分组,相当于就只有一组,把所有的行进行聚合

引入 group by 就可以针对不同的组,来分别进行聚合

现在有一张 salarytable 工资表:

查询每个职位的平均工资:

select role,avg(salary) from salarytable group by role;
+--------+------------------+
| role   | avg(salary)      |
+--------+------------------+
| 服务员 |      6000.000000 |
| 程序猿 |     22500.000000 |
| 老板   | 110000000.000000 |
+--------+------------------+

如果不带聚合函数的普通查询,是否能用 group by 呢?

答:可以,但是查询出来的结果是每个分组的第一条记录

select * from salarytable group by role;
+----+------+--------+--------------+
| id | name | role   | salary       |
+----+------+--------+--------------+
|  5 | 赵六 | 服务员 |      6000.00 |
|  3 | 张三 | 程序猿 |     20000.00 |
|  1 | 马云 | 老板   | 100000000.00 |
+----+------+--------+--------------+

1.3.2 指定条件的分组查询

分组查询,可以指定条件,通常使用 where 和 having 进行指定条件

where 和 having 的区别:

  • 分组之前,指定条件。先筛选,再分组,使用 where

  • 分组之后,指定条件。先分组,再筛选,使用 having

注:在一条SQL语句中,分组之前和之后可以同时指定条件

1.分组之前,指定条件

select role,avg(salary) from salarytable where role !='程序猿' group by role;
+--------+------------------+
| role   | avg(salary)      |
+--------+------------------+
| 服务员 |      6000.000000 |
| 老板   | 110000000.000000 |
+--------+------------------+

画图分析:

2.分组之后,指定条件

select role,avg(salary) from salarytable group by role having role != '老板';
+--------+--------------+
| role   | avg(salary)  |
+--------+--------------+
| 服务员 |  6000.000000 |
| 程序猿 | 22500.000000 |
+--------+--------------+

画图分析:

猜你喜欢

转载自blog.csdn.net/m0_66488562/article/details/129379419
今日推荐