聚合查询相当是行和行之间进行运算。
下文中的所有示例操作都是基于此表:
聚合函数
count(列名)
select count(列名) from 表名;
统计该表中该列的行数,但是 null 值不会统计在内,但是如果写为 count(*) null 也会算进去(就算一整行都是 null 也会算进去)
例如我们暂时使用这个表进行演示:
此表有一行全为空
sum(列名)
select sum(列名) from 表名;
只能针对数字类型使用,也可以对多列进行相加求一个总和;
对该表中的math列的值进行求和。
注:会将 null 值排除在外,不予计算。
avg(列名)
select avg(列名) from 表名;
对该表中的该列进行求平均值。
只能针对数字类型使用
注:会将 null 值排除在外,不予计算。
max(列名)
select max(列名) from 表名;
求出该表中该列的最大值。
只能针对数字类型使用
注:会将 null 值排除在外,不予计算。
min(列名)
select min(列名) from 表名;
求出该表中该列的最小值。
只能针对数字类型使用
注:会将 null 值排除在外,不予计算。
group by
group by 可以实现对数据进行分组。
一般的使用方法都是先用 group by 进行分组然后再利用聚合函数进行聚合查询。
select * from 表名 group by 列名;
group by 会将该列中值相同的分为一组。因为没有使用order by 进行排序操作所以MySQL并不会对查询结果的顺序做出保证。
此时我们在原有表的基础上再加一行数据。
加入该条数据后该表变成了:
此时再进行分组查询操作:
此时因为没有使用聚合函数所以 张三这一行 只是在张三这一组中选了一个代表进行展示。
如果加入聚合函数就可以很清楚的看到,聚合函数会以每组为单位进行操作。
此时如果我们不想让某行(某几行)参与分组就可以在 group by 之前加入 where 进行条件筛选。
select * from 表名 where 条件 group by 列名;
例:此时我们不想让 null 这个空值和 math=100 的行参与分组
注意:where 条件 必须在 group by 之前
在后面就会报错。
having
having 其实和 where 差不多都是进行条件筛选的语句。
group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where 语句,而需要用 having
having是对分组之后的数据进行筛选的。
例:此时我们不想让 null 这个空值和 成绩=100 的行参与分组
此时的语句执行顺序为:
所以 having 子句中的条件一定要和 select 中的对应
注:having 必须写在 group by 子句之后。