首先我们应该熟悉什么是聚合函数(又名聚集函数):
例如MIN(),Max(),SUM(),COUNT(),AVG() 这类的,我们称作是聚合函数。
那么我们不能在where子句中使用这些函数,为什么呢?
聚合函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的(这里过滤是在一个记录里边过滤的,基于"行"),更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!
而where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。
与where子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的having子句。为什么?因为在水平方向上根据外部指定条件的筛选(也就是对行的筛选),where子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过having子句配合聚集函数来完成。
按照下面这个就是错误的,会报一个错误:Group function is not allowed here
部门员工表
dept_id部门ID department 部门名 name员工名 salaty 工资 city 分公司所在城市 startyear入职年份
找出北京分公司中部门内平均工资大于1万的部门员工的平均工资, 列出部门ID, 部门名和部门平均工资
select dept_id,department,avg(salary)
from employees
where city="北京"
group by department
having avg(salary)>10000
order by dept_id
原因。
sql语句的执行顺序为
from子句 : from 那个表(数据库已有的表或者是子查询的虚拟表)
where 子句: where对表的行数据做筛选, 比如 where city="北京", 会筛选出城市名等于北京的行
group by 子句 group by 对行筛选的数据做分组 ,比如group by department,会按照部门分组
having 子句 having 在前面基础上对数据的列做计算 having avg(salary)>10000, 把group by分组后的部门里 部门平均工资大于1万的部门保留下来,
order by 子句 order by 在以上处理后的结果集基础上排序, order by dept_id, 在以上处理后的结果集基础上按照部门ID排序