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 |
+--------+--------------+
画图分析: