在sql语句中分组是很重要的一部分,在很多地方都用的着,他经常与聚合函数一起使用
用到分组的例子:
查询公司中每个部门的人数 select count(*) from 表名 group by 部门编号
当然在分组时和分组后有一些条件限制,这就用到了 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>=2having 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