MYSQL分组函数及分组查询

108 阅读2分钟

分组函数(多行处理函数)

输入多行,最后输出一行

  • count 计数
  • sun 求和
  • avg 平均数
  • max 最大值
  • min 最小值

注意:分组函数用的时候,必须先分组,然后才能使用(具体原因后面再说),如果你们没有对数据进行分组,那么整张表默认为一组
注意2:正常的SELECT语句如果有数学运算的话,如果有NULL参加运算的话,结果为空

分组函数的特点

  1. 分组函数自动忽略NULL,不需要提前对NULL进行处理(NULL不是一个值,是空)
  2. count(* ) 和 count(具体字段)有什么区别吗:count(具体)是返回该字段下的不为NULL的元素的个数count(* ):是返回统计表中的总行数,ps:统计表中不可能有全为NULL的一行,所以count(* )无论如何都是表的总行数
  3. 分组函数不可以写在where中?为什么?和前面的先分组有关系
  4. 分组函数可以组合起来使用

分组查询(分组查询很重要)

SELECT FROM WHERE GROUP BY HAVING ORDER BY 关键字的顺序不能颠倒
执行顺序:

  1. from
  2. where
  3. group by
  4. having
  5. select
  6. order by
  7. 所以分组函数为什么不能写在where中?,因为必须先分组再使用,而where执行的时候 group by,也就是分组还没执行呢,所以不行
  8. 不写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不可以