where和having的区别
过滤方式 | 特点 |
---|---|
where | where进行分组前的过滤;where后面不能写聚合函数 |
having | having 是分组后的过滤;having后面可以写聚合函数 |
mysql简单查询执行顺序
from–> where–> group by --> having --> select --> order by
案例
--查询平均薪资大于6000的部门名称不为null的部门,需要在分组后再次进行过滤,使用having
select dept_name,
avg(salary)
from emp
where dept_name is not null
group by dept_name
having avg(salary)>6000;
where 和on 的区别
过滤方式 | 特点 |
---|---|
where | where是先生成关联表再对关联表进行筛选;where的优先级低于left join |
on | on是先对表进行筛选在生成关联表;on执行的优先级高于left join |
当我们使用on关键字时,会先根据on后面的条件进行筛选,条件为真时返回该行,由于on的优先级高于left join,所以left join关键字会把左表中没有匹配的所有行也都返回;where对与行的筛选是在left join之后的,也就是生成临时表之后才对临时表进行筛选。
on是选筛选后关联,where是先关联后筛选。
案例
select t1.* from t1 left join t2 on t1.a=t2.a and t1.b>2;
select t1.* from t1 left join t2 on t1.a=t2.a where t1.b>2;