group by语句中的having和where子句

在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

发布了71 篇原创文章 · 获赞 14 · 访问量 5613

猜你喜欢

转载自blog.csdn.net/flying_hengfei/article/details/102833327