1,关于where 后面不能直接使用聚合函数
where属于行级过滤,后面不能直接使用聚合函数!(聚合函数考虑放在having后面/变成子查询放在where后面)。因为聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对整行数据进行过滤的
▶ where的过滤是最终的,它的移除是不可挽回的,利用where过滤掉的行便不再参与group by 的分组和having的分组过滤。
2,having
:过滤分组,与 group by
连用,不能单独使用。
having中可以是普通条件的筛选,也能是聚合函数。而where只能是普通函数,一般情况下,有having可以不写where,把where的筛选放在having里,SQL语句看上去更丝滑。
使用where再group by
先把不满足where条件的数据删除,再去分组
使用group by再having
先分组再删除不满足having条件的数据,这两种方法有区别吗,几乎没有!
注意:不同的是,having语法支持聚合函数,其实having的意思就是针对每组的条件进行筛选。我们之前看到了普通的筛选条件是不影响的,但是having还支持聚合函数,这是where无法实现的。
3,SQL中只要用到聚合函数就一定要用到group by吗
答案:
1、当只做聚集函数查询时候,就不需要进行分组了。
2、当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by举例来说:
情况一:
不需要使用Group by 进行分组,因为其中没有非聚合字段,所以不用Group by 也可以。
SELECT SUM(bonus) FROM person情况二:
SELECT SUM(bonus),gender FROM person GROUP BY gender由于gender是非聚合字段,Group by 后才可以正常执行。
注意:分组聚合一定不要忘记加上
group by
,不然只会有一行结果。
4.SELECT语句的执行顺序(在MySQL和Oracle中,SELECT执行顺序基本相同):
FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT