一、Having与where的区别
1、分组前后过滤
Having 是分组后对数据进行过滤
Where 是在分组前对数据进行过滤
2、是否能使用聚合函数
Having后面可以使用聚合函数
Where后面不可用使用聚合函数
SELECT [ALL|DISTINCT] <目标表达式>....
FROM <表名或者视图名>..
[WHERE <条件表达式>]
[GROUP BY <列名 1> [HAVING] <条件表达式>]
[ORDER BY <列名 2> [ASC|DESC]]
在查询过程中执行顺序:from>where>group(含聚合)>having>order>select。
为什么不能使用聚合函数呢?
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
因为where在分组函数之前执行,where后面跟的条件表达式一定要是表中字段,聚合函数是表中没有的字段,所以不行。
比如数据:
这样写完全没有问题。
SELECT Ssex,COUNT(Ssex) FROM `student` GROUP BY Ssex WHERE Sage > 10;
但是下面这样下就不行了
SELECT Ssex,COUNT(Ssex) FROM `student` WHERE SUM(Sage) > 10 GROUP BY Ssex ;
为什么不行呢? 因为表中是没有SUM(Sage)该字段的。
Having的话,就可以跟聚合函数,因为是过滤已经分好组的表。这样写完全没问题
SELECT Ssex,COUNT(Ssex) FROM `student` GROUP BY Ssex HAVING SUM(Sage) > 10 ;
HAVING结合聚合函数表示:年龄和大于10的分组。 是筛选的分组出来,而不是每个分组中大于10的