having子句与where子句

1.相同点
都是对记录进行筛选
2.不同点
2.1 where 不能放在group by后面

2.2 having 是跟group by连在一起用的,放在group by 后面,此时的作用相当于where

2.3 where 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING可以。

一、where子句

where子句:where子句仅仅用于从from子句中返回的值,from子句返回的每一行数据都会用where子句中的条件进行判断筛选,where子句中允许使用比较运算符和逻辑运算符

二、having子句

having子句:having子句通常是与group by子句一起使用的,因为having的作用是对使用group by 进行分组统计后的结果进行进一步的筛选。
三、下面通过where子句和having子句的对比,更进一步的理解他们

在查询过程中聚合函数(SUM,MIN,MAX,AVG,COUNT)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选。where子句在查询过程中执行优先级别优先于聚合函数(SUM,MIN,MAX,AVG,COUNT),因为他是一句一句筛选的,HAVING子句可以让我们筛选成组后的对各组数据筛选。而WHERE子句在聚合前筛选记录,如:现在我们想要部门号不等于10的部门并且工资总和大于8000的部门编号?

分析:通过where子句筛选除部门编号不为10的部门,然后对部门工资进行统计,然后使用having子句对统计结果进行筛选。

 select deptno,sum(sa1) from emp

    where deptno<>'10'  group by deptno

    having sum(sa1)>8000;

FAQ:1.既然where 和having 都可以对记录进行筛选 那么为什么不直接用having?
HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
2.为什么group by 之后不可以用where 子句 ?
答:1).首先 我们看一下数据库的书写顺序 以及 执行顺序
书写顺序:select … from … where … group by … having … order by … limit …
好的 我们看到 书写顺序应该是where 在 group by 之前 ,你要问我为啥,
我会说甲鱼的屁股–规定。。。

2).然后我们再看一下执行顺序
执行顺序:from–>where–>select–>group by–>having–>order by–>limit…
我们可以看到 where 子句 是在 group by 之前执行的 也就是说 我们先找到表,再根据where子句的条件进行筛选 ,再进行查询操作 ,之后再进行分组等操作 ,所以说 group by 是对 基于where 条件查询的结果进行操作。 having子句是会在分组后对分组形成的结果进行过滤。

也正是因为执行顺序所以where中可以使用表别名但是不能使用列别名 ,而having中可以使用表别名 也可以使用列别名。

小结:where子句只能接受from子句输出的数据,而having子句则可以接受来自group by ,where或者from子句的输入。

参考了很多大佬的文章 ,侵删。
以上。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值