分组函数(多行处理函数)
输入多行,最后输出一行
- count 计数
- sun 求和
- avg 平均数
- max 最大值
- min 最小值
注意:分组函数用的时候,必须先分组,然后才能使用(具体原因后面再说),如果你们没有对数据进行分组,那么整张表默认为一组
注意2:正常的SELECT语句如果有数学运算的话,如果有NULL参加运算的话,结果为空
分组函数的特点
- 分组函数自动忽略NULL,不需要提前对NULL进行处理(NULL不是一个值,是空)
- count(* ) 和 count(具体字段)有什么区别吗:count(具体)是返回该字段下的不为NULL的元素的个数count(* ):是返回统计表中的总行数,ps:统计表中不可能有全为NULL的一行,所以count(* )无论如何都是表的总行数
- 分组函数不可以写在where中?为什么?和前面的先分组有关系
- 分组函数可以组合起来使用
分组查询(分组查询很重要)
SELECT FROM WHERE GROUP BY HAVING ORDER BY 关键字的顺序不能颠倒
执行顺序:
- from
- where
- group by
- having
- select
- order by
- 所以分组函数为什么不能写在where中?,因为必须先分组再使用,而where执行的时候 group by,也就是分组还没执行呢,所以不行
- 不写group by不代表没分组,只不过是把整张表当成一个组
- !!! group by有一个原则:就是select 后面的所有列中,没有使用聚合函数的列,必须出现在group by 后面。
- !!! 在分完组之后聚合函数(分组函数)对数据进行处理,就不是那个大列了,而是分完组之后的每个小区域
- 因为是分组函数,所以是对组进行处理了,只不过你不分组,他把整个大表看为一个表,不要之前用了就觉得他是全局的了
- 联合分组,可以group by a,b相当于把他们联合起来分成一组
having
- having不能单独使用,必须在group by
- 是在group by后面再进行进一步进行筛选的
- 但是能用where还是尽可能的先用where,再用having,因为这样效率好一些
- 一个先筛选再分组(where),一个先分组再筛选(having)
- 有些情况就是无法用where的,例如先筛选的这个筛选他做不了 工资>3000可以 平均工资>3000不可以