其实我们说yii2的WHERE和HAVING区别,就是在说mysql中WHERE和HAVING的区别。这两个货都能完成数据的筛选功能,一般来说我们喜欢将HAVING和GROUP BY搭配使用。
但是一定不要误以为:“HAVING只能和GROUP BY搭配使用”。
记住一大原则,三大场景就可准确把握它们的使用方法~~
一大原则:HAVING从筛选的结果再筛选,WHERE直接筛选。
三大场景:
沒有GROUP BY的时候,只使用WHERE而不使用HAVING(其实也能用,但是不推荐)。
有GROUP BY的时候,WHERE在GROUP BY前面,HAVING在GROUP BY后面。
使用HAVING的时候,只用在跟GROUP BY相关结果的处理上。
没看明白?下面举例说明
例子一:获取价格大于20的所有商品名称和价格
# A
SELECT price,name FORM `goods` WHERE `price` > 20
# B
SELECT price,name FORM `goods` HAVING `price` > 20
在A和B中会得到相同的结果,这也证明了HAVING完全可以独立门户,但是我们不推荐,对于B语句而言,是从SELECT price,name FROM goods
的结果集中再一次筛选price > 20这个条件。
若B 改为
SELECT name FORM `goods` HAVING `price` > 20
则会报错,因为在结果集中没有price。
例子二:查询每种category_id商品的价格平均值,获取平均价格大于1000元的商品信息
# A
SELECT `category_id` , AVG(`price`) AS ag FROM `goods` GROUP BY `category_id` HAVING ag > 1000
# B
SELECT `category_id` , AVG(`price`) AS ag FROM `goods` WHERE ag>1000 GROUP BY `category_id`
执行后,我们发现A语句莫问题,B语句报错了~说明什么?
HAVING是对已经查到的ag再次进行了筛选,而WHERE是对数据表直接查询,数据表中并没有ag字段。这个例子也证明了HAVING是作用在GROUP BY执行后的结果集上。
例子三:将所有价格大于30的商品搜索出来,然后按照category_id分组
# A
SELECT `category_id` FROM `goods` WHERE `price` > 30 GROUP BY `category_id`
# B
SELECT `category_id`,`price` FROM `goods` GROUP BY `category_id` HAVING `price` > 30
二者都可以执行,例子中WHERE和GROUP BY没有任何关系,而having必须作用于group by执行后的结果。
总之一句话:HAVING从筛选的结果再筛选,WHERE直接筛选,把握住这点就一起明朗。
分享自 北哥工兵连