对于大部分了解mysql数据库并且会增删查改基本操作的程序员来说,看到这个标题,第一反应是:
a、where用于正常的字段过滤,除了聚类group by;
b、having只用于group by.
上面两点算对,但也只对了部分,实际这两者本质的区别就是where筛选的是数据库表里面本来就有的字段,而having筛选的字段是从前筛选的字段筛选的:
a、where和having都可以使用的场景:
select goods_price,goods_name from sw_goods where goods_price>100
select goods_price,goods_name from sw_goods having goods_price>100
原因:goods_price作为条件也出现在了查询字段中。
b、只可以使用where,不可以使用having的情况:
select goods_name,goods_number from sw_goods where goods_price>100
select goods_name,goods_number from sw_goods having goods_price>100(X)
原因:goods_price作为筛选条件没有出现在查询字段中,所以就会报错。
having的原理是先select 然后从select出来的进行筛选。而where是先筛选在select。
c、只可以使用having,不可以使用where的情况:
select goods_category_id,avg(good_price) as ag from sw_goods group by goods_category having ag>1000
select goods_category_id,avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category(X)报错,这个表里没有这个ag这个字段。
where子句中一般不使用聚合函数那种情况。
感谢https://www.cnblogs.com/ljf-Sky/p/9024683.html对我知识的补充!