关于Where与having的原理
Where 的原理是根据条件去检索.
Having 是根据条件从检索到的内容中根据条件来筛选.
使用场景
能使用Where的尽量使用Where.虽然都是遍历.不过机制上来说,前置速度会快些.
但是涉及一些结果处理来筛选的时候.
例如:两列的值相减大于某个数的行.SELECT *,(t.c1-t.c2) as tt FROM for_pan_test.new_table t having tt >0;
SELECT *,(t.c1-t.c2) as tt FROM for_pan_test.new_table t where (t.c1-t.c2) >0;
这样都可以的.但是如果出现聚合,那就必须使用having了.因为在聚合之前,是不知道该值的(SQL92 标准不支持该查询.SQL99之后支持如果出现sql_model=only_full_group_by.disable该模式 详见).
SELECT *,(sum(t.c1)-t.c2) as tt FROM for_pan_test.new_table t group by t.s1 having tt >0;
这时候使用where的结果就行了.SELECT *,(sum(t.c1)-t.c2) as tt FROM for_pan_test.new_table t where (t.c1-t.c2) >0 group by s1;