where 和 having之间的区别【mysql】
在看这篇文章之前相信你对sql的语法顺序和执行顺序已经有了足够的认识。如果还不了解sql的语法顺序和执行顺序请点击 sql的语法顺序和执行顺序 http://www.jiajiajia.club/blog/artical/236 查看。
1.where、聚合函数、having的执行顺序
where>聚合函数(sum,min,max,avg,count)>having
2.作用
where关键字的作用是过滤,选取符合条件的记录,而having关键字的作用则是,为聚合结果指定条件。
3.执行时机
where是数据从磁盘读入内存时的条件,而having是分组统计时条件,所以having是在对select查询的字段中进行的操作。其实having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。
4.执行条件
where的执行条件是数据表中存在的字段。而不是查询结果集中存在的字段,因为从sql执行的顺序中可知,表达式计算的时期要在where条件之后。
例如 SELECT id,a,b,(a+b) as c from test WHERE c=3
则会报错 > 1054 - Unknown column 'c' in 'where clause'
having的执行条件是查询的结果集中存的字段或分组的字段。因为having执行要在where条件之后。另外若须引入聚合函数来对group by 结果进行过滤 则只能用having。
例如 SELECT id,b,(a+b) as c from test having c=3 不会报错
但是 SELECT id,b,(a+b) as c from test having a=3 则会报错 > 1054 - Unknown column 'a' in 'having clause' 因为a字段没有在查询列中。
但是如果变成 SELECT id,b,(a+b) as c from test GROUP BY a having a=3 字段a经过分组后不会报错。因为select语句的执行顺序在from和having之后,虽然select最后的结果集中没有a字段,但是执行from的结果集的虚拟表中是存在a字段的,因为需要用它分组。
5.需要注意的是
1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。