MySQL详解 --- 聚合与分组
1. 聚合函数
注意:
-
count函数的使用: count(*)、count(id)、count(1)。 count(*)能统计一共有多少条记录,而count(id)是统计id列的非空值的记录数,也就是说它们的值可能不同。 在聚合函数的查询语句中,不能查询除了聚合函数和分组字段之外的字段,因为这样没有意义(一般数据库会报错)。 select max(age) from stu √ select max(age),name from stu × 聚合函数一般配合group by一起使用 聚合函数在配合group by时,可以额外查询分组字段。 select max(age), gender from stu group by gender √
2. 分组查询
分组查询就是将原有的数据进行分组统计。
select 分组列名1, 分组列表2, 聚合函数1, 聚合函数2 from 表名 group by 分组列名1, 分组列名2;
从格式我们可以看出,分组是可以根据多个字段进行分组的。
• 分组后的条件筛选
select 分组列名, 聚合函数 from 表名 [where 条件1] group by 分组列名 [having 条件2(可以根据聚合函数的值进行判断)];
我们既可以用where进行条件筛选,也可以用having进行条件筛选。但是这两者放置的位置以及代码执行的逻辑是不同的!
注意:
-
select中出现的字段,必须在分组当中。 having子句中出现的条件判断的字段,也必须在分组当中。
例子:
-- 1 select gender, max(age) from student where gender=男 group by gender; -- 2 select gender, max(age) from student group by gender having gender=男;
对于示例1,where是对from和select的结构进行筛选的,在经过这一层筛选后,再执行group by进行分组。
对于实例2,having是对group by进行筛选的,在group by执行完毕后,再进行筛选。
SQL查询中各个关键字的执行先后顺序: from > on > join > where > group by > with > having > select > distinct > order by > limit