1、Mysql中Having和Where用法

        当SQL语句中使用聚合函数,然后又需要对聚合函数的记录集进行筛选过滤时,这个时候就需要用到Having子句。如果是在聚合函数前过滤记录用Where,在聚合函数后对组记录数据进行筛选就需要用Group by和Having组合。其实也可以换个角度理解也就是where是对真实表的数据进行过滤,而having是依赖于聚合函数生成的二维表数据进行过滤。

        总结:where作用于表数据过滤,Having作用于组数据的过滤;where在分组和聚合之前选取数据,having在分组和聚合之后选取分组数据。

2、where、聚合函数、having在from后面的执行顺序:

        where > 聚合函数 > having

        若需要对聚合函数对group by的结果进行过滤,只能使用having。Having语句通常与Group by语句联合使用,用来过滤Group by语句返回的结果集,Having语句的存在弥补了Where关键字不能与聚合函数联合使用的不足。

        例如:查询平均成绩大于60分的同学的学号和平均成绩

                select s_id, AVG(s_score) s_avg from Score group by s_id Having AVG(s_score) > 60;

                也可以写成如下形式:

                select s_id, AVG(s_score) s_avg from Score group by s_id Having s_avg > 60;

        如果将Having改成where 就会报错,因为where的执行顺序大于聚合函数。

3、使用where和from注意事项

        (1)where后不能跟聚合函数,因为where执行顺序大于聚合函数。

        (2)where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即“在分组之前进行过滤数据”,条件中不能包含聚合函数,使用where条件显示特定的行。

        (3)having子句的作用是筛选满足条件的组,即“在分组之后过滤数据”,条件中经常包含聚合函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐