前言
having 用来过滤 分组后的数据(group by)或者聚合函数(aggregate)的结果集;
因为一般分组数据都是搭配聚合函数使用,所以也可以说having一般都是用来过滤分组后的数据;
目录
- having 语句介绍
- having 例子
- having 跟 where 的区别
- 简化SQL:给聚合函数取别名
正文
1. having 语句介绍
语句格式如下:
select column1, aggregate_fun() as res
from table_name
where filter_condition
group by column1
having res_filter_condition
order by column1 desc
-
having 作用于 group by 之后,order by 之前:
- 即先通过 where 过滤数据,
- 再通过 group by 对过滤后的数据中进行分组,
- 然后通过 having 对分组后的数据进行过滤,
- 最后再通过 order by 进行降序排列
-
流程如下图所示:
2. having 例子
假设有如下所示的数据库 s_user;
- 下面我们用 having 对 group by分组后的数据进行过滤:过滤条件为 分组中的数据量>1
select *, substring(name,1, 5) as nameSub, count(*) as groupCount from s_user where age > 10 group by nameSub having groupCount > 1 order by id desc
输出结果如下:
下面我们简单分析一下上面的语句:
substring(name, 1, 5) as nameSub
:截取name字段值的前5位,并取一个别名nameSub,这个别名在当前SQL的后续部分还可以继续使用
count(*) as groupCount
: 聚合函数count(*),统计每个分组中的记录个数,并将记录个数取一个别名为groupCount;如果没有搭配 group by 分组函数,那么count(*)
返回符合条件的所有记录个数- group by nameSub: 分组语句,将数据按照指定的字段或这表达式进行分组,比如这里就是按照字段name的前5位进行分组
- having groupCount: 过滤语句,即本篇介绍的内容,用来过滤分组后的数据;
- order by id desc: 排序语句,将结果集按照id进行降序排列
3. having 跟 where 的区别:
上面的例子可以看到,having跟where很像,都是用来过滤数据;
区别就是
- where属于第一层过滤,即分组 group by 之前的过滤
- 而having属于第二层过滤,即分组 group by 之后的数据
下面再列出之前的流程图以便回顾(加了颜色来区分):
但是如果SQL语句中没有使用group by(即没有进行分组),那么having就等同于where;
比如下面的例子:
select * from s_user having age > 10 order by id desc
输出结果如下:
可以看到,跟where的效果一样;
总结
- having 用来过滤分组后的数据,作用于 group by 之后;
- 如果SQL语句中没有进行分组,那么having和where作用一致,都是过滤数据(但是一般不这样用);
评论区