维克多阿涛

2022-05-25   阅读量: 94

Mysql

where条件里为什么不能有聚合函数?

首先我们应该熟悉什么聚合函数(又名聚集函数)

例如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排序


261.8182 2 0 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子