地球人都知道,Where关键字的做用是过滤,选取符合条件的记录,而Having关键字的做用则是,为聚合结果指定条件。可是,在某些条件下,使用这二者能够获得同样的结果。函数
好比如下的例子:spa
1.
SELECT BoxType,COUNT(1) FROM BoxType GROUP BY BoxType HAVING BoxType='小箱';
2. SELECT BoxType,COUNT(1) FROM BoxType WHERE BoxType='小箱' GROUP BY BoxType;
这两段语句获得的结果是同样的。code
那么他们二者的区别在哪呢?blog
首先,Where 子句是用来指定 "行" 的条件的,而Having 子句是指定 “组” 的条件的,即排序
Where 子句 = 指定行所对应的条件索引
Having 子句 = 指定组所对应的条件class
所以,2 语句会比较合适。效率
其次,当在Where子句和Having子句中均可以使用的条件,从语句的执行效率来看,最好写在Where子句中。数据
在使用Count函数等对表中的数据进行聚合操做时,DBMS内部会进行排序处理,而排序操做会增长机器的负担,减小排序的行数,能够增长处理速度。di
使用Where子句指定条件时,因为排序以前就对数据进行了过滤,因此可以减小排序的数据量。可是Having子句是在排序以后才对数据进行分组的,所以与前者相比,须要排序的数据量就要多得多。
第三,使用Where子句更具速度优点的另外一个理由是,能够对Where子句指定条件所对应的列建立索引,这样能够大幅提升处理速度。
第四,Where子句中不能使用聚合函数,而Having子句中能够。