热线电话:13121318867

登录
2022-01-19 阅读量: 852
MYSQL语句执行顺序之:having与where的使用区别、具体使用场景

目录:

1、having与where是什么?二者有什么区别?(理论层->)

2、having与where的使用场景(实操层->)



正文:

1、having与where是什么?二者有什么区别?

》》》概念层
Where 是一个约束声明,用于约束来自数据库的数据,是在分组前对数据进行过滤(结果返回之前起作用),Where不能使用聚合函数。

Having是一个过滤声明,是在在分组后对数据进行过滤(查询返回结果集以后对查询结果进行的过滤操作),在Having中可以使用聚合函数。

作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。


》》》在查询过程中:

聚合语句(sum,min,max,avg,count)要比having子句优先执行;
    
而where子句在查询过程中执行优先级高于聚合语句。


》》》在查询过程中执行顺序:

from>where>group(含聚合)>having>order>select


2、having与where的使用场景

(1)where和having都可以使用(但含义不同)

使用where:select goods_price,goods_name from sw_goods where goods_price > 100
使用having:select goods_price,goods_name from sw_goods having goods_price > 100

(2)只可以用where,不可以用having

使用where:select goods_name,goods_number from sw_goods where goods_price > 100
使用having:select goods_name,goods_number from sw_goods having goods_price > 100
(使用having报错!!!因为前面并没有筛选出goods_price 字段)
 
区别:
having是对select筛选的字段再筛选,如果前面没有select goods_price 就会报错!!
而where是从数据表中的字段直接进行的筛选,如果前面没有select goods_price 不会报错!!

(3)只可以用having,不可以用where

使用where:select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category  ag>1000
(如果按照SQL语句的执行顺序,原理上是会报错的,但在SQL5.7版本之后的是可以执行的,不过建议在实际操作中不要使用别名,有的数据库可能无法执行)

使用having:
select goods_category_id,avg(goods_price) as ag from sw_goods  ag>1000 group by goods_category 
(报错!!因为from sw_goods 这张数据表里面原先没有ag这个字段,where是在select之前对字段进行条件约束)
151.7264
0
关注作者
收藏
评论(0)

发表评论

暂无数据