在sql语句中分组是很重要的一部分,在很多地方都用的着,他经常与聚合函数一起使用
聚合函数:
1. count:计算个数
select count (计算的字段名)from 表名
select count (ifnull(字段名,替换值))from 表名
select count(*) from 表名 ;只要一列中有一个值非空,就会计算2. max:计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值
用到分组的例子:
查询公司中每个部门的人数
select count(*) from 表名 group by 部门编号
having 和Wehre 子句
当然在分组时和分组后有一些条件限制,这就用到了 having 和Wehre 子句
- having是分组(group by)后的筛选条件,分组后的数据组内再筛选
where则是在分组前筛选 - where子句中不能使用聚集函数,而having子句中可以,所以在集合函数中加上了HAVING来起到测试查询结果是否符合条件的作用。
即having子句的适用场景是可以使用聚合函数 - having 子句限制的是组,而不是行
- having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle
当同时含有 where 子句、group by 子句 、having 子句及聚集函数时,执行顺序如下:
- 执行where子句查找符合条件的数据;
- 使用group by 子句对数据进行分组;
- 对group by 子句形成的组运行聚集函数计算每一组的值;
- 最后用having 子句去掉不符合条件的组
例如 1:
查询公司中相同年龄的人数,输出年龄和对应人数,少于2个人的忽略
select
age,
count(*) num--用于计算一个年龄的人数,并重命名为num
from
表名
group by age --与年龄进行分组
having num>=2
having num>=2 --筛选同一年龄少于2人的组,值的一提的是这里只能用having 不能用where, 因为 num是count(*)的 重命名 ,然而在where语句中不用用聚合函数
例子 2:
查询工龄大于5年的员工的年龄分布情况(查询公司中相同年龄的人数,输出年龄和对应人数,少于2个人的忽略)
select
age,
count(*) num --用于计算一个年龄的人数,并重命名为num
from
表名
where
工龄>5 先筛选出工龄大于5的员工,然后在进行分组
group by age
having num>=2
执行顺序:where -> group by -> having