按照执行顺序进行书写。
Select语句的执行顺序:
1. FROM, 2. WHERE, 3. GROUP BY, 4.HAVING, 5.SELECT,6.ORDER BY, 7.LIMIT。
having作用于组,where作用于表。
例:
select deptno,job ,count(*) as 员工数
from emp
group by deptno,job; -- 先执行from后面的字段
select deptno,job,avg(sal) as 平均工资
from emp
group by deptno,job having job='clerk'; ---先分组再筛选
select deptno,job,avg(sal) as 平均工资
from emp
where job='clerk'
group by deptno; ---先筛选再分组进行聚合运算(where的效率更高,计算量更小)
having存在的意义:where只能存现在from的后面,where中不能出现聚合函数,不能出现在group by(在分组的同事进行聚合运算)后面,否则会出现书写顺序错误。
select deptno, avg(sal) as 平均工资
from emp
group by deptno
having avg(sal)>2000; -- 对分好的组进行筛选只能使用having。
select deptno, avg(sal) as 平均工资
from emp
group by deptno
where avg(sal)>2000; -- 报错:书写顺序不正确。
select deptno, avg(sal) as 平均工资
from emp
where avg(sal)>2000,
group by deptno -- 报错:where子句中不能用聚合函数,先执行where,再执行group by和聚合运算。
select deptno, avg(sal) as 平均工资
from emp
group by deptno
having 平均工资>2000; --having中用平均工资(即在select定义好的别名,在MySQL5.7之后的版本)。








暂无数据