Where 是一个约束声明,使用 Where 约束来 自数据库 的数据,Where 是在结果返回之前起作用的, Where 中不能使用聚合函数。 Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在 Having 中可以使用聚合函数。 在查询过程中聚合语句(sum,min,max,avg,count) 要比 having 子句优先执行 。而where 子句在查询过程中执行优先级 高于聚合语句。 下面用一个例子进一步说明问题。假设有数据表:
CREATE TABLE `test`.`salary_info` ( `id` int (10) unsigned NOT NULL auto_increment, `deparment` varchar (16) NOT NULL default '' , `name ` varchar (16) NOT NULL default '' , `salary` int (10) unsigned NOT NULL default '0' , PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
例1: 要查找平均工资大于3000的部门
则
sql
语句应为:
select deparment, avg (salary) as average from salary_info group by deparment having average > 3000
此时只能使用
having
,而不能使用
where
。一来,我们要使用聚合语句
avg
;二来,我们要对聚合后的结果进行筛选(
average > 3000
),因此使用
where
会被告知
sql
有误。
例2 :要查询每个部门工资大于 3000 的员工个数 sql语句应为:
select deparment, count (*) as c from salary_info where salary > 3000 group by deparment
此处的
where
不可用
having
进行替换,因为是直接对库中的数据进行筛选,而非对结果集进行筛选。