mysql 中where 和having 的区别
相同点二者都是对数据集进行的过滤

sql中where和having的区别
a. where 和having 使用的地方不一样
where可以用于select、update、delete和insert into values(select * from table where …)语句中。
having只能用于select语句中

b. 执行的顺序不一样
where的搜索条件是在执行语句进行group by 之前应用
having的搜索条件是在group by条件后执行的
即如果where和having一起用时,where会先执行,having后执行

c.子句有区别
因为执行顺序的区别,where 后面是对原数据进行的过滤,having是对结果集进行的过滤,所以having中可以使用别名,聚合函数等,而且having中字段必须出现在select 后面,where 只能对元数据字段进行过滤
where 后面要跟的是数据表里的字段,where针对数据库文件的发挥作用。
而having只是根据前面查询出来的结果集再次进行查询,因此having是针对结果集发挥作用。

注意事项
不要错误的认为having和group by 必须配合使用.having 单独也可以使用

1.where和having都可以使用的场景:

select goods_price,goods_name from goods where goods_price > 100
 select goods_price,goods_name from goods having goods_price > 100

上面的having可以用的前提是我已经筛选出了goods_price字段,在这种情况下和where的效果是等效的。
但是如果没有select goods_price 就会报错!!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。
意思是having 字段必须在select 语上,这和order by 一样
此可以看到where 是针对数据库文件(原数据发挥作用 ), hvaing是针对结果集发挥作用。

其实第二个sql语句等价于如下语句更好理解:

select goods_price,goods_name from goods where 1 having goods_price > 100
2. 只可以用where,不可以用having的情况:

select goods_name,goods_number from goods where goods_price > 100
  select goods_name,goods_number from goods having goods_price > 100

解释:第二个sql语句报错,这是因为前面并没有筛选goods_price 造成的,更能看出having是针对结果集发挥作用。
3. 只可以用having,不可以用where情况:
查询每种category_id商品的价格平均值,获取平均价格大于1000元的商品信息。

select category_id , avg(goods_price) as ag from goods group by category_id having ag > 1000
 select category_id , avg(goods_price) as ag from goods where ag>1000 group by category_id

解释:第二个sql语句报错,这是因为from goods 这张数据表里面没有ag这个字段
where是对原数据进行的过滤,所以where 字句中不能有别名
having字句是对结果集的过滤,所以可以有别名
其实别名定义是在group by 之后定义的,所以group by 语句后都可以使用别名
where 后面要跟的是数据表里的字段,where针对数据库文件的发挥作用。
而having只是根据前面查询出来的结果集再次进行查询,因此having是针对结果集发挥作用。

总结
0. WHERE语句可以使用在很多场景,如update insert select …having 只能使用在select 语句中
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。是对原始数据集进行的过滤,所以where 后的字段必须出现在原始表中
2.HAVING 子句是对结果集进行的操作,所以having后字段必须出现在select 语句中,having后可以使用聚合函数
3. 因为执行顺序不一样,where 语句在分组前执行,having 是在分组后执行,所以having 中可以使用别名(group by 语句后定义的别名)
4.说明having 不是一定要和group by 一起使用的,可以单独使用