侧边栏壁纸
  • 累计撰写 94 篇文章
  • 累计创建 100 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

MySQL-数据过滤之 having

汤圆学Java
2022-11-28 / 0 评论 / 0 点赞 / 130 阅读 / 1,309 字
温馨提示:
本文最后更新于 2022-11-28,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

having 用来过滤 分组后的数据(group by)或者聚合函数(aggregate)的结果集;

因为一般分组数据都是搭配聚合函数使用,所以也可以说having一般都是用来过滤分组后的数据;

目录

  1. having 语句介绍
  2. having 例子
  3. having 跟 where 的区别
  4. 简化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 进行降序排列
  • 流程如下图所示:

image-20220522163759797

2. having 例子

假设有如下所示的数据库 s_user;

image-20220522151620765

  • 下面我们用 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

​ 输出结果如下:

image-20220522151800180

下面我们简单分析一下上面的语句:

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 之后的数据

下面再列出之前的流程图以便回顾(加了颜色来区分):

image-20220522165912268

但是如果SQL语句中没有使用group by(即没有进行分组),那么having就等同于where;

比如下面的例子:

select * from s_user having age > 10  order by id desc

输出结果如下:

image-20220522170003796

可以看到,跟where的效果一样;

总结

  1. having 用来过滤分组后的数据,作用于 group by 之后;
  2. 如果SQL语句中没有进行分组,那么having和where作用一致,都是过滤数据(但是一般不这样用);
0

评论区